And*_*ios 10 java postgresql jpa criteria-api jpa-2.0
我有一个Lawsuit包含a 的类,List<Hearing>每个类都有一个Date属性.
我需要选择所有按照Lawsuits日期排序的Hearings
我有一个CriteriaQuery之类的
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Lawsuit> cq = cb.createQuery(Lawsuit.class);
Root<Lawsuit> root = cq.from(Lawsuit.class);
Run Code Online (Sandbox Code Playgroud)
我使用distinct来展平结果:
cq.select(root).distinct(true);
Run Code Online (Sandbox Code Playgroud)
然后我加入 Lawsuit与Hearing
Join<Lawsuit, Hearing> hearing = root.join("hearings", JoinType.INNER);
Run Code Online (Sandbox Code Playgroud)
创造Predicates
predicateList.add(cb.isNotNull(hearing.<Date>get("date")));
Run Code Online (Sandbox Code Playgroud)
和Orders:
orderList.add(cb.asc(hearing.<Date>get("date")));
Run Code Online (Sandbox Code Playgroud)
如果我避免distinct,一切正常,但如果我使用它,它会抱怨无法根据SELECT中没有的字段进行排序:
引起:org.postgresql.util.PSQLException:错误:for
SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中
将List<Hearing>已经访问过Lawsuit班回来了,所以我很困惑:我应该如何将它们添加到选择列表?
我已经在其他地方发现了问题的根源,解决问题就没有必要去做问题中的问题; 如其他答案所述,应该没有必要在distinct这里执行.
重复的行是由left join对集合(根对象的属性)执行的错误s 发起的,即使未使用谓词:
Join<Lawsuit, Witness> witnesses = root.join("witnesses", JoinType.LEFT);
if (witnessToFilterWith!=null) {
predicateList.add(cb.equal(witnesses.<Long>get("id"),witnessToFilterWith.getId()));
}
Run Code Online (Sandbox Code Playgroud)
本join应作为显然被执行inner,并仅在需要:
if (witnessToFilterWith!=null) {
Join<Lawsuit, Witness> witnesses = root.join("witnesses", JoinType.INNER);
predicateList.add(cb.equal(witnesses.<Long>get("id"),witnessToFilterWith.getId()));
}
Run Code Online (Sandbox Code Playgroud)
所以,如果你在这里是因为你遇到了同样的问题,请在联接中搜索问题.
| 归档时间: |
|
| 查看次数: |
3741 次 |
| 最近记录: |