JPA规范相当于ResultTransformer.DISTINCT_ROOT_ENTITY?

时间:2014-05-08 10:25:28

标签: java sql jpa distinct

我想知道在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,但结果总是一样。

有人在那里提供一些帮助我的建议吗? : - )

提前致谢!

亲切的问候, ķ

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

您可以根据根表的主键列通过group by重复删除:

cq.groupBy(root.get("id"));

假设WebContentImpl.is是该表的主键列。