是否可以通过使用Java中的条件查询或jpql来执行我的自定义订单?在我的表中,我有一列-数字类型(目前,此列包括诸如1
,2
,3
,5
,10
之类的数字)。我想按2
,5
,1
,10
,3
的顺序对结果进行排序。
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();
我该怎么做?
最佳答案
您必须在CASE
子句中使用ORDER BY
表达式来实现这种"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
通过条件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());
当然,更好的解决方案是将这些值标准化在一个单独的表中,您可以将其加入以进行排序:
SELECT *
FROM t
JOIN orderings o ON t.myNumberField = o.myNumberField
ORDER BY o.orderDefinition
关于java - 我在标准查询/jpql中的自定义订单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55807061/