繁体   English   中英

JPA 2 Criteria API中的SELECT DISTINCT + ORDER BY

[英]SELECT DISTINCT + ORDER BY in JPA 2 Criteria API

我有一个Lawsuit类,其中包含一个List<Hearing> ,每个都有一个Date属性。

我需要选择在Hearing日期之前订购的所有Lawsuit

我有一个CriteriaQuery之类的

CriteriaBuilder           cb = em.getCriteriaBuilder();
CriteriaQuery<Lawsuit>    cq = cb.createQuery(Lawsuit.class);
Root<Lawsuit>           root = cq.from(Lawsuit.class);

我使用distinct将结果展平:

cq.select(root).distinct(true);

然后,我参加 Lawsuit Hearing Lawsuit

Join<Lawsuit, Hearing> hearing = root.join("hearings", JoinType.INNER);

创建Predicate

predicateList.add(cb.isNotNull(hearing.<Date>get("date")));

Order

orderList.add(cb.asc(hearing.<Date>get("date")));

如果我避免使用distinct ,一切都会很好,但是如果使用它,它将抱怨无法基于不在SELECT中的字段进行排序:

原因:org.postgresql.util.PSQLException:错误:对于SELECT DISTINCTORDER BY表达式必须出现在选择列表中

List<Hearing>已经可以通过返回的Lawsuit类进行访问,所以我很困惑: 如何将它们添加到选择列表中?

我已经在其他地方发现了问题的根源,而解决它就不必去做问题中所要解决的问题了。 如其他答案中所述,此处不必执行distinct

即使没有使用谓词,重复的行也由对集合(根对象的属性)执行的错误left join发起的:

Join<Lawsuit, Witness> witnesses = root.join("witnesses", JoinType.LEFT);
if (witnessToFilterWith!=null) {
    predicateList.add(cb.equal(witnesses.<Long>get("id"),witnessToFilterWith.getId()));
}

显然,该join应作为inner执行,并且仅在需要时执行

if (witnessToFilterWith!=null) {
    Join<Lawsuit, Witness> witnesses = root.join("witnesses", JoinType.INNER);
    predicateList.add(cb.equal(witnesses.<Long>get("id"),witnessToFilterWith.getId()));
}

因此,如果因为遇到相同的问题而在这里,请在joins中搜索问题

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

 cq.groupBy(root.get("id")); // Assuming that Lawsuite.id is primary key column

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM