我想知道在JPA规范中是否有相当于ResultTransformer.DISTINCT_ROOT_ENTITY?现在,我正在尝试实现搜索功能,我必须使用JPA规范(我不允许使用CriteriaQuery或其他替代方案)。
我必须在搜索查询中执行JOIN,因为实体之间存在一对多的关系。
所以,现在,我正在这样做:
String type = "admin";
SpecificationBuilder sb = SpecificationBuilder.getInstance();
Specification<WebContentImpl> spec = new Specification<WebContentImpl>() {
@Override
public Predicate toPredicate(Root<WebContentImpl> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
return cb.equal(root.join("users", JoinType.LEFT).get("type"), type);
}
};
sb.addSpecification(spec);
如您所见,我可以加入一个JOIN。多个用户被映射到单个Web内容项。但是,当例如3个用户映射到1个Web内容项时,Web内容项应该只显示1次,但它显示3次。我过去遇到过这个问题,然后标志ResultTransformer.DISTINCT_ROOT_ENTITY帮助了我,但我现在无法使用该功能。
当然,我可以实施我自己的解决方案,以省去双打,但这对于表现来说会很糟糕。我已经尝试过更改JoinType,但结果总是一样。
有人在那里提供一些帮助我的建议吗? : - )
提前致谢!
亲切的问候, ķ
答案 0 :(得分:1)
答案 1 :(得分:0)
您可以根据根表的主键列通过group by
重复删除:
cq.groupBy(root.get("id"));
假设WebContentImpl.is
是该表的主键列。