我在将相当简单的纯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;但这会影响表现。
答案 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