JPA: выполнить порядок без учета регистра - PullRequest
6 голосов
/ 30 марта 2012

У меня есть следующий запрос:

select p from Plan as p where p.location = :location order by p.name

Проблема в том, что если есть три плана следующим образом: Яблочная атомная летучая мышь Масло

Возвращается следующее: Яблочная масляная атомная летучая мышь

Мне требуется следующее: Яблочный атом Летучая мышь

Ответы [ 3 ]

14 голосов
/ 30 марта 2012

Например, в Hibernate вы можете использовать функцию LOWER для p.name в ORDER BY:

select p from Plan as p where p.location = :location order by LOWER(p.name)

Я предполагаю, что выше не гарантируется работа со всеми реализациями JPA, потому что аргумент ORDER BY не является одним из следующих:

  1. State_field_path_expression, которое оценивается как поле состояния, которое можно заказать, или Тип абстрактной схемы встраиваемого класса, указанный в предложении SELECT одним из следующих способов:
    • переменная general_identification_variable
    • single_valued_object_path_expression
  2. state_field_path_expression, которое оценивает одно и то же поле состояния того же объекта или встраиваемый тип абстрактной схемы в виде выражения state_field_path_ex в предложении SELECT
  3. result_variable, который ссылается на заказываемый элемент в предложении SELECT, для которого тот же переменная result_variable была указана. Это может быть результатом выражения aggregate_expression, scalar_expression или state_field_path_expression в предложении SELECT. Например, четыре запроса ниже являются законными.

Если он не работает с используемой реализацией JPA, вам нужно использовать следующий запрос:

select p, LOWER(p.name) AS name_order 
from Plan as p 
where p.location = :location order by name_order 

Недостатком является то, что результатом запроса является список массивов объектов, причем первый элемент в каждом списке является экземпляром объекта Plan, а второй элемент должен быть отброшен.

5 голосов
/ 24 июня 2013

Follow получает результаты, отсортированные по 'orderField' без учета регистра

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = criteriaBuilder.createQuery(MyEntity.class);
Root<MyEntity> root = cq.from(MyEntity.class);
cq.select(root).where(...).orderBy(cb.desc(cb.upper(duplicate.get(MyEntity_.orderField))));
TypedQuery<MyEntity> query = entityManager.createQuery(cq);
query.getResultList();

Это все равно что сказать запросу преобразовать все символы в верхний регистр перед сортировкой

1 голос
/ 16 июля 2016

Порядок без учета регистра можно получить, используя аннотацию OrderBy, обернув столбец порядка с LOWER или UPPER

@OrderBy("UPPER(firstName) ASC")
private List<User> members = new ArrayList<User>(); 

Ниже SQL, сгенерированного hibernate

SELECT user0_.id AS id1_0_0_,
       user0_.firstname AS firstname2_0_1_,
       user0_.lastname AS lastname3_0_1_
FROM user user0_
WHERE user0_.user_id=?
ORDER BY upper(user0_.firstname)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...