JPA Criteria API, использующий ISNULL в порядке следования

1

Я использую MySQL 5.5 с Hibernate 3.6 и JPA 2.0. У меня есть таблица User с именем firstName, которая также может быть пустой или пустой. Я хочу, чтобы эти пустые результаты firstName были последними в моих результатах поиска. Для этого я написал следующий SQL-запрос, который отлично работает:

SELECT * FROM User ORDER BY ISNULL(firstName), firstName = "", firstName ASC LIMIT 100

Теперь вы хотите перевести это на JPA с помощью API критериев, и я не совсем уверен в этом порядке. Вот что я имею:

criteriaQuery = criteriaQuery.orderBy(cb.asc(cb.isNull(users.get(User_.firstName))), cb.asc(cb.equal(users.get(User_.firstName), "")), cb.asc(users.get(User_.firstName)));

Однако приведенный выше фрагмент кода не работает, потому что метод CriteriaBuilder.isNull() преобразован в IS NULL, а не в функцию ISNULL() MySQL. Я получаю следующее исключение:

org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: is null 

Любые идеи о том, как проверить нуль в инструкции Order by с JPA 2.0

Теги:
hibernate
jpa

2 ответа

1
Лучший ответ

Это невозможно. В JPA вы можете ORDER BY поля ORDER BY которые вы выбрали (которые находятся в части SELECT вашего запроса). Проблема в том, что нет функции IS_NULL, которая может использоваться в части SELECT.

  • 0
    Так что есть еще один способ поместить пустые и пустые записи строк в нижней части результата с помощью API критериев JPA
  • 0
    Я вижу одно решение: NativeQueries.
0

Я получаю ту же проблему, что и вы, наконец, я решаю ее таким образом, возможно, вы можете попробовать:

  CriteriaQuery<> query;
  query.orderBy(cb.desc(cb.selectCase().
when(cb.isNull("field name"),0).otherwise(1)),
cb.asc("field name");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню