QueryDSL分页重复排序

时间:2016-08-03 09:09:14

标签: sorting distinct paging querydsl

我有一个实体A说汽车与实体B的OneToMany关系说CarProperty。

My Car Repository扩展了QueryDslPredicateExecutor以支持分页和排序:

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

我正在尝试执行一个查询,我按照CarProperty列对结果进行排序,在 pageable 变量上定义排序。 然而,由于它是Car和CarProperty之间的一对多关系,我已经返回了Car的副本。 是否有可能使用这种结构在Car上获得不同的结果?

如果无法在谓词上使用distinct,我怎样才能在谓词中表示以下查询(使用exists来消除重复):

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 个答案:

答案 0 :(得分: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);