我有一个实体 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;
提前致谢
您可以使用命名实体图来避免重复记录,在我的例子中它有效。
@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);