Я реализую метод поиска в 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);
Извини, что плохо, я забыл о первом способе





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();
}
Почему вы выполняете условие в предложении select, а не в предложении where?