本文介紹了我在條件查詢中的定制訂單依據(jù)/jpql的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
是否可以在Java中使用Criteria Query或jpql執(zhí)行我的定制訂單?在我的表中,我有一個(gè)列號(hào)類型(目前,該列包括諸如1
、2
、3
、5
、10
之類的數(shù)字)。我想按2
、5
、1
、10
、3
的順序?qū)Y(jié)果進(jìn)行排序。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb.createQuery(MyEntity.class);
Root<MyEntity> root = cq.from(MyEntity.class);
cq.select(root);
cq.where(cb.equal(root.get("someMyFields"), "myExpectedFieldValue"));
cq.orderBy(cb.asc(root.get("myNumberField"))); // how can I sort result in this order 2, 5, 1, 10, 3?
TypedQuery<MyEntity> query = em.createQuery(cq);
query.setFirstResult(0);
query.setMaxResults(200);
return query.getResultList();
我該怎么做?
推薦答案
您必須在ORDER BY
子句中使用CASE
表達(dá)式才能實(shí)現(xiàn)這種"sort indirection"。在SQL和JPQL中,這將是:
ORDER BY CASE myNumberField
WHEN 2 THEN 1
WHEN 5 THEN 2
WHEN 1 THEN 3
WHEN 10 THEN 4
WHEN 3 THEN 5
ELSE 6
END
使用Criteria API,使用CriteriaBuilder.selectCase()
cq.orderBy(
qb.selectCase(root.get("myNumberField"))
.when(qb.literal(2), qb.literal(1))
.when(qb.literal(5), qb.literal(2))
.when(qb.literal(1), qb.literal(3))
.when(qb.literal(10), qb.literal(4))
.when(qb.literal(3), qb.literal(5))
.otherwise(qb.literal(6))
.getExpression()
.asc());
當(dāng)然,更好的解決方案是在單獨(dú)的表中標(biāo)準(zhǔn)化這些值,您可以只為排序而聯(lián)接該表:
SELECT *
FROM t
JOIN orderings o ON t.myNumberField = o.myNumberField
ORDER BY o.orderDefinition
這篇關(guān)于我在條件查詢中的定制訂單依據(jù)/jpql的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,