2016-08-03 4 views
2

나는 Carity를 ​​말하기 위해 OneToMany 관계를 가진 Entity A say Car를 가지고있다.QueryDSL 페이징 중복 정렬

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

내가 페이징 변수에 정렬을 정의, 나는 결과를 정렬 곳 CarProperty의 열을 기준으로, 쿼리를 실행하기 위해 노력하고있어 :

내 자동차 저장소 페이징 및 정렬을 지원하기 위해 QueryDslPredicateExecutor를 확장 . 그러나 Car와 CarProperty 사이의 일대 다 관계이므로 Car의 중복을 반환했습니다. 이 구조를 사용하여 자동차에서 별개의 결과를 얻을 수 있습니까? 는 술어에 뚜렷한 사용할 수없는 경우

, 내가 술어에서 다음 쿼리를 나타낼 수있는 방법 (사용하여 중복을 제거하기 위해 존재) : 사전에

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; 

감사를

답변

1

당신이 할 수있는 필자의 경우 중복 된 레코드를 피하기 위해 명명 된 엔티티 그래프를 사용합니다.

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

다음

@EntityGraph(value = "Car.carProperty" , type = EntityGraphType.LOAD) 
Page<Car> findAll(Predicate predicate, Pageable pageable); 
방법 findall은 오버라이드 (override)