Jpql @query случай, когда

Я реализую метод поиска в JPQL, который ищет все объекты класса Institution по заданному параметру в двух полях класса. Если объектов нет, он должен вернуть null. Этот код работает, но возвращает пустую коллекцию вместо нуля.

@Query("select  i from Institution i where i.city like concat('%', :pattern, '%') or " +
        "i.name like concat('%', :pattern, '%') ")
List<Institution> findAll(@Param("pattern") String criteria);

Итак, я попробовал этот способ, который, кажется, работает, но это не так.

  @Query("select case when((i.city like concat('%', :pattern, '%')) or (i.name like concat('%', :pattern, '%' )) ) " +
        "then i else null END " +
        "from Institution i")
List<Institution> findAll(@Param("pattern") String criteria);

Почему вы выполняете условие в предложении select, а не в предложении where?

Simon Martinelli 06.01.2019 12:25

Извини, что плохо, я забыл о первом способе

szachMati 06.01.2019 12:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
418
2

Ответы 2

JPA всегда возвращает пустые коллекции. Spring Data JPA вызывает query.getResultList ()

getResultList
java.util.List getResultList()
Execute a SELECT query and return the query results as an untyped List.
Returns:
a list of the results
Throws:
IllegalStateException - if called for a Java Persistence query language UPDATE or DELETE statement
QueryTimeoutException - if the query execution exceeds the query timeout value set and only the statement is rolled back
TransactionRequiredException - if a lock mode has been set and there is no transaction
PessimisticLockException - if pessimistic locking fails and the transaction is rolled back
LockTimeoutException - if pessimistic locking fails and only the statement is rolled back
PersistenceException - if the query execution exceeds the query timeout value set and the transaction is rolled back

Плохая практика - возвращать null, если возвращаемый тип является коллекцией, потому что потребитель вашего метода предполагает, что в случае отсутствия элемента коллекция пуста.

Так почему вы хотите вернуть null?

Спасибо за совет Саймону :). Я нашел ошибку. На уровне класса обслуживания я забыл проверить, есть ли пустые символы. Таким образом, контроллер возвращал весь список, преобразованный в dto из базы данных. Первое решение - это правильно. Он требовал только этого:

 public List<InstitutionDTO> findAll(String criteria) {
   if (criteria.trim().length() == 0) {
       throw new InstitutionSearchNotFoundException();
   }  

Другие вопросы по теме