2016-08-03 1 views
2

J'ai une entité A dire Car avec une relation OneToMany à une entité B dit CarProperty.QueryDSL Paging Tri des doublons

Mon dépôt Car étend QueryDslPredicateExecutor pour soutenir la pagination et le tri:

Page<T> findAll(Predicate predicate, Pageable pageable); 

Je suis en train d'exécuter une requête où je trier les résultats, par une colonne de CarProperty, définissant le tri sur paginable variables . Cependant, comme il s'agit d'une relation One to Many entre Car et CarProperty, j'ai renvoyé des doublons de Car. Est-il possible d'obtenir des résultats distincts sur Voiture en utilisant cette structure?

S'il est impossible d'utiliser distincte sur le prédicats, comment pourrais-je représenter la requête suivante dans le prédicat (en utilisant existe pour éliminer les doublons):

SELECT Car.* 
FROM Car C LEFT JOIN CarProperty CP ON (C.ID = CP.CAR_ID) 
WHERE EXISTS (SELECT 1 
       FROM CarProperty CP2 
       WHERE CP2.CAR_ID = C.ID AND CP2.ID = CP.ID) 
ORDER BY CP.PROPERTY_NAME ASC; 

Merci à l'avance

Répondre

1

Vous pouvez utiliser le graphique de l'entité nommée pour éviter les enregistrements en double, dans mon cas cela a fonctionné.

@NamedEntityGraph(name = "Car.carProperty" ,attributeNodes = @NamedAttributeNode("carProperties")) 
    @Entity 
    public class Car { 
     @OneToMany 
     @JoinColumn(name = "carProperties") 
     private List<CarProperty> carProperties; 
    } 

puis remplacer procédé findall

@EntityGraph(value = "Car.carProperty" , type = EntityGraphType.LOAD) 
Page<Car> findAll(Predicate predicate, Pageable pageable);