QueryDSL 分页排序重复项

问题描述 投票:0回答:1

我有一个实体 A(比如 Car)与实体 B(比如 CarProperty)具有一对多关系。

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

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

我正在尝试执行一个查询,通过 CarProperty 列对结果进行排序,并在 pageable 变量上定义排序。 然而,由于 Car 和 CarProperty 之间是一对多关系,因此我返回了 Car 的重复项。 使用这种结构是否可以在 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;

提前致谢

sorting pagination distinct querydsl
1个回答
2
投票

您可以使用命名实体图来避免重复记录,在我的例子中它有效。

    @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);
© www.soinside.com 2019 - 2024. All rights reserved.