【问题标题】:Criteria. Select biggest of two标准。选择两个中最大的
【发布时间】:2014-02-12 04:07:38
【问题描述】:

在将相当简单的纯 sql 语句重写为条件查询时,我遇到了困难。 基本上我可以将查询简化为

select max(T.value, S.value) from T, S where T.id = S.id

我试过了

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();

Root<T> fromT = cq.from(T.class);
Root<S> fromS = cq.from(S.class);

cq.where(cb.equal(fromT.get("id), fromS.get("id"));

cq.select(); //  <---- what to put here.


getEntityManager().createQuery(cq).getResultList();

我找到了最好的方法,但它是水平比较(列中的值),我想比较同一行但不同列中的两个值,并得到一个最大的值。

我想到的唯一解决方案是获取结果并“手动”对它们进行排序,但这会影响性能。

【问题讨论】:

    标签: sql hibernate criteria


    【解决方案1】:

    你可以试试下面的case语句。

    cb.selectCase().
        when(cb.greaterThanOrEqualTo(fromT.get("xValue"), fromS.get("yValue")), fromT.get("xValue")). //-- If T has max value
        otherwise(fromS.get("yValue")); //-- Else, by default select value from S
    

    【讨论】:

      【解决方案2】:

      你可以只使用case语句吗?

      SELECT
        CASE
          WHEN T.value < S.value THEN S.value
          ELSE T.value
        END
      FROM
        T, S
      WHERE
        T.id = S.id
      

      如果可能的话,我还建议将其更改为内部连接:

      SELECT
        CASE
          WHEN T.value < S.value THEN S.value
          ELSE T.value
        END
      FROM
        T INNER JOIN S
          ON T.id = S.id
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多