jpql @ запрос, когда - PullRequest
       7

jpql @ запрос, когда

0 голосов
/ 06 января 2019

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

@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);

Ответы [ 2 ]

0 голосов
/ 06 января 2019

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

 public List<InstitutionDTO> findAll(String criteria) {
   if(criteria.trim().length() == 0) {
       throw new InstitutionSearchNotFoundException();
   }  
0 голосов
/ 06 января 2019

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...