2016-08-03 13 views
2

Ich habe eine Entität A sagen Auto mit einer OneToMany-Beziehung zu einer Entität B sagen CarProperty.QueryDSL Paging Sortierung Duplikate

My Car Repository erweitert QueryDslPredicateExecutor Paging zu unterstützen und Sortierung:

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

Ich versuche, eine Abfrage auszuführen, wo ich die Ergebnisse sortieren, durch eine Säule von CarProperty, definieren die Art auf seitenwechselbar Variable . Da es jedoch eine One to Many Beziehung zwischen Auto und CarProperty ist, habe ich Duplikate von Auto zurückgegeben. Ist es möglich, mit dieser Struktur eindeutige Ergebnisse zu erhalten?

Wenn es nicht möglich ist, auf dem Prädikat verschieden zu verwenden, wie könnte ich die folgende Abfrage in dem Prädikat darstellen (unter Verwendung existiert Duplikate zu eliminieren):

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; 

Vielen Dank im Voraus

Antwort

1

können Sie Verwenden Sie das benannte Entitätsdiagramm, um doppelte Datensätze zu vermeiden. In meinem Fall funktionierte es.

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

und dann außer Kraft setzen findall Methode

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