我有一个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()));
}
因此,如果因为遇到相同的问题而在这里,则在联接中搜索问题。