我有一个实体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;
提前致谢
答案 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);