Мой заказ по критериям запроса / jpql - PullRequest
1 голос
/ 23 апреля 2019

Можно ли сделать мой заказ, используя критерии запроса или jpql в Java? В моей таблице есть столбец - тип чисел (на данный момент этот столбец содержит такие числа, как 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();

Как я могу это сделать?

1 Ответ

0 голосов
/ 23 апреля 2019

Вы должны использовать выражение CASE в своем предложении ORDER BY для реализации такого вида "сортировки косвенности" .В 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
...