当前位置: 首页 > 知识库问答 >
问题:

我的自定义订单在标准查询/jpql

郑宜民
2023-03-14

可以在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();

我怎么能做到呢?

共有2个答案

贲凌
2023-03-14

您还可以通过使用数据库bean中的特殊字段来使用CriteriaQuery自定义排序:

// this is used for obtaining an arbitrary ordering by statuses
@Formula(value="(CASE status\n" +
        "           WHEN 'DELETED'::text THEN 1\n" +
        "           WHEN 'UPDATED'::text THEN 2\n" +
        "           WHEN 'SUBMITTED'::text THEN 3\n" +
        "           ELSE 10\n" +
        "           END)")
private int statusPriority;

可以通过分页对象将statusPriority用作常规排序字段。结果查询将包含以下内容:

order by (CASE quotationv0_.status
           WHEN 'DELETED'::text THEN 1
           WHEN 'UPDATED'::text THEN 2
           WHEN 'SUBMITTED'::text THEN 3
           ELSE 10
           END) asc
宋建本
2023-03-14

您必须在ORDER BY子句中使用CASE表达式来实现这种间接排序。在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。选择case()

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
 类似资料:
  • 我的问题是空值必须是最后一个order by语句。下面是我的代码截图。我使用javax持久性标准生成器。我的问题很复杂。 如何通过criteria builder以零价格完成订单?

  • WooCommerce默认使用post ID作为订单号,post可以是订单,也可以是产品、页面、文章或其它的custom post type,所以这个ID是不连续的,人们并不能简单的通过订单号去猜测你网站的销量。但这也给商店管理者带来一定困扰,拿到一个订单号,却无法知道是什么时候的订单,是哪个商店的订单。所以要给订单号加前缀,前缀里带上具体时间和一个序号,就能解决这个问题。 用代码自定义订单号的显

  • 说明 微信支付查询订单SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\OrderQuery\Request 属性 名称 类型 说明 $_apiMethod string 接口名称 $transaction_id string

  • 说明 支付宝境外到店支付-订单查询 官方文档:https://global.alipay.com/service/external_QR_Code/28 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\Query\Request 属性 名称 类型 说明 $service string 接口名称 $partner_trans_id st

  • 请求地址 https://api.es.xiaojukeji.com/river/Approval/getOrder 返回数据格式 JSON 请求类型 GET 请求参数 参数名称 数据类型 必选 说明 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access token timestamp string yes 当

  • 3.2 查询订单 3.2.1 描述 通过调用该接口为指定订单号的订单明细 3.2.2 请求地址 地址:https://api.bokecs.com/recharge/order/get?orderNo=15 3.2.3 请求方式 GET 3.2.4 请求参数 1) 请求入参 元素名称 是否必须 元素描述 orderNo 是 订单号 2) 请求出参 { "code": "", "message":