2016-08-03 10 views
2

У меня есть сущность А говорят, что автомобиль с отношением OneToMany к Entity B говорит CarProperty.QueryDSL Пейджинг Сортировка дубликатов

Мой автомобиль Repository расширяет QueryDslPredicateExecutor для поддержки пейджинга и сортировки:

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

Я пытаюсь выполнить запрос, где я сортировать результаты, столбиком CarProperty, определяя вид на выгружаемой переменной , Однако, поскольку это отношение «Один ко многим» между Car и CarProperty, я вернул дубликаты автомобилей. Можно ли получить отличные результаты по автомобилю, используя эту структуру?

Если это не представляется возможным использовать отличие от предиката, как я мог бы представить следующий запрос в предикате (используя существует для устранения дубликатов):

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; 
    } 

, а затем переопределить метод FindAll

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