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

我需要选择按其Lawsuit的日期排序的所有Hearing

我有一个CriteriaQuery之类的

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

我使用独特的来平整结果:
cq.select(root).distinct(true);

然后,我Lawsuit一起加入 Hearing
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,一切都会很好,但是如果我使用List<Hearing>,它会提示无法基于SELECT之外的字段进行排序:



通过返回的Lawsuit类已经可以访问ojit_code,所以我很困惑:我应该如何将它们添加到选择列表中?

最佳答案

我已经在其他地方发现了问题的根源,而解决它就不必去做问题中所要解决的问题了。
如其他答案中所述,此处不必执行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()));
}

因此,如果因为遇到相同的问题而在这里,则在联接中搜索问题。

10-07 15:57