我有一个类Lawsuit
,它包含一个List<Hearing>
,每个List<Hearing>
都有一个Date
属性。
我需要选择按Hearing
日期排序的所有Lawsuit
我有一个条件查询,如
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
连接起来
Join<Lawsuit, Hearing> hearing = root.join("hearings", JoinType.INNER);
创建Predicate
predicateList.add(cb.isNotNull(hearing.<Date>get("date")));
和Order
S:
orderList.add(cb.asc(hearing.<Date>get("date")));
如果我避免使用distinct
,一切都正常,但如果我使用它,它会抱怨无法基于不在SELECT:
错误原因:错误:对于SELECT DISTINCT
,ORDER BY
表达式必须出现在选择列表中List<Hearing>
已经可以通过返回的Lawsuit
类访问,所以我很困惑:如何将它们添加到选择列表中?
2条答案
按热度按时间rvpgvaaj1#
我已经在别的地方发现了问题的根源,解决了它就没有必要做问题中所问的事情;如其他答案所述,此处不需要执行
distinct
。重复的行是由错误的
left join
引起的,即使没有使用 predicate ,这些left join
也是在集合(根对象的属性)上执行的:显然,
join
应作为inner
执行,并且仅在需要时:所以,如果您来这里是因为遇到了同样的问题,请在连接中搜索问题。
cgvd09ve2#
也可以根据根表的主键列,通过group by进行重复删除: