比較兩列並獲取最小/最大值的最簡單方法是使用CASE語句。
在JPQL,查詢看起來像
select a from EntityA a join a.entityXList x
where a.numValueA=CASE WHEN x.numValueY <= x.numValueZ THEN x.numValueY ELSE x.numValueZ END
and a.numValueB=CASE WHEN x.numValueY >= x.numValueZ THEN x.numValueY ELSE x.numValueZ END
您可以使用代碼的CriteriaBuilder.selectCase()相當於但是我從來沒有CriteriaBuilder的大風扇。如果需求迫使你使用CriteriaBuilder,那麼請讓我知道,我可以嘗試編碼等效。
CriteriaBuilder最小/最大值旨在獲取一列中所有條目的最小值/最大值。假設你想獲得具有最大字符串名稱的實體。該代碼看起來像
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(EntityX.class);
Root<EntityX> root = query.from(EntityX.class);
Subquery<String> maxSubQuery = query.subquery(String.class);
Root<EntityX> fromEntityX = maxSubQuery.from(EntityX.class);
maxSubQuery.select(cb.greatest(fromEntityX.get(EntityX_.nameX)));
query.where(cb.equal(root.get(EntityX_.nameX), maxSubQuery));
我在
https://github.com/juttayaya/stackoverflow/tree/master/JpaQueryTest
不幸的是,定義最小/最大通過CriteriaBuilder的謂詞是我的要求。因爲,正如你所指出的那樣,最大也是最不重要的是在單個表達式(例如Column)上運行的聚合函數,所以我們需要將兩列轉換爲單列,可能需要通過樞軸或子查詢操作,如上所述。幸運的是,還有另一種方法可以調用我希望實現的功能... –