gpt4 book ai didi

java - 我的自定义订单按条件查询/jpql

转载 作者:太空宇宙 更新时间:2023-11-04 09:42:32 27 4
gpt4 key购买 nike

是否可以使用 Java 中的条件查询或 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

使用标准 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com