我在条件查询中的定制订单依据/jpql [英] My custom order by in criteria query/jpql

查看:0
本文介绍了我在条件查询中的定制订单依据/jpql的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以在Java中使用Criteria Query或jpql执行我的定制订单?在我的表中,我有一个列号类型(目前,该列包括诸如123510之类的数字)。我想按251103的顺序对结果进行排序。

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表达式才能实现这种"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());

当然,更好的解决方案是在单独的表中标准化这些值,您可以只为排序而联接该表:

SELECT *
FROM t
JOIN orderings o ON t.myNumberField = o.myNumberField
ORDER BY o.orderDefinition

这篇关于我在条件查询中的定制订单依据/jpql的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆