2016-08-03 77 views
2

我有一個實體說汽車與一個實體B的OneToMany關係說CarProperty。QueryDSL尋呼排序重複

我的汽車庫擴展QueryDslPredicateExecutor支持分頁和排序:

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

我想,我對結果進行排序來執行一個查詢,通過CarProperty的一列,上定義分頁變量排序。然而,由於它是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; 
    } 

,然後覆蓋的findall方法

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