【问题标题】:SELECT DISTINCT + ORDER BY in JPA 2 Criteria API在 JPA 2 Criteria API 中选择 DISTINCT + ORDER BY
【发布时间】:2016-10-31 21:23:09
【问题描述】:

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

我需要选择所有按Hearings 日期排序的Lawsuits

我有一个类似的 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);

然后我加入 LawsuitHearing

Join<Lawsuit, Hearing> hearing = root.join("hearings", JoinType.INNER);

创建Predicates

predicateList.add(cb.isNotNull(hearing.<Date>get("date")));

Orders:

orderList.add(cb.asc(hearing.<Date>get("date")));

如果我避免使用distinct,一切正常,但如果我使用它,它会抱怨无法根据不在 SELECT 中的字段进行排序:

原因:org.postgresql.util.PSQLException: ERROR: for SELECT DISTINCT, ORDER BY 表达式必须出现在选择列表中

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

【问题讨论】:

  • 好吧,您是否需要列表 的子选择,然后也许您可以在子选择中按顺序排列?我现在没时间看。
  • 谢谢@Nicholas;您将如何使用条件 api 进行内部查询?
  • This answer 可能会有所帮助。
  • 我不使用 Criteria API,但在那里编写子查询应该也很简单。
  • @DraganBozanovic:应该,我同意,但我不知道如何做到这一点(对于带有 Criteria API 的选定字段)。顺便说一句,我发现问题出在连接中(真是个笨蛋)。随意回答一些关于独特和连接的规范和更通用的用途(不涉及 Criteria API),我会奖励你。干杯

标签: java postgresql jpa jpa-2.0 criteria-api


【解决方案1】:

我在其他地方发现了问题的根源,并且解决了问题,因此没有必要按照问题中的要求去做; 如其他答案所述,这里应该没有必要执行distinct

即使没有使用谓词,重复行也是由在集合(根对象的属性)上执行的错误left joins 引起的:

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()));
}

因此,如果您因为遇到同样的问题而来到这里,请在联接中搜索问题

【讨论】:

    【解决方案2】:

    您还可以根据根表的主键列通过group by进行去重:

     cq.groupBy(root.get("id")); // Assuming that Lawsuite.id is primary key column
    

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 2016-03-09
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      相关资源
      最近更新 更多