![](/img/trans.png)
[英]JPA Criteria API select distinct on String Lob with Constructor Expression
[英]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 DISTINCT
,ORDER 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.