标准。选择最大的两个

时间:2014-02-12 04:07:39

标签: sql hibernate criteria

我在将相当简单的纯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();

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

我想到的唯一解决办法就是获取结果并手动对其进行排序&#39;但这会影响表现。

2 个答案:

答案 0 :(得分:0)

你能使用案例陈述吗?

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

答案 1 :(得分:0)

您可以尝试以下案例陈述。

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