Может ли javax.persistence.Query.getResultList() возвращать значение null?

И если да, то при каких обстоятельствах?

Спецификация Javadoc и JPA ничего не говорит.


person rdk    schedule 12.07.2009    source источник
comment
Я искал именно этот вопрос! Спасибо! до 4 вас!   -  person rafa.ferreira    schedule 02.06.2010


Ответы (7)


Ты прав. Спецификация JPA ничего не говорит об этом. Но Java Persistence with Hibernate book, 2-е издание говорит:

Если результат запроса пуст, возвращается null

Реализация Hibernate JPA (Entity Manager) возвращает значение null, когда вы вызываете query.getResultList() без результата.

ОБНОВЛЕНИЕ

Как отмечают некоторые пользователи, кажется, что новейшая версия Hibernate вместо этого возвращает пустой список.

Пустой список также возвращается в Eclipselink, если результаты не найдены.

person Arthur Ronald    schedule 12.07.2009
comment
Это, безусловно, устарело, Hibernate возвращает пустой список. - person Michael Laffargue; 17.06.2013
comment
Я все еще получаю ноль от Hibernate 4.3.10 (работает как механизм JPA для Spring Data). Это происходит только для одного собственного запроса, так как типичные запросы JPA работают должным образом. - person Jacek Prucia; 25.06.2015
comment
Просто проверьте оба условия, используя OR. if(rows == null || rows.size == 0){} где rows — это то, что возвращает getResultList() - person Number945; 22.05.2017
comment
Просто оберните его в Optional.ofNullable(), и все готово. - person de.la.ru; 22.09.2017
comment
Я полагаю, что возврат null вместо пустого списка не является тем, что предусмотрено спецификацией, поскольку в противном случае совершенно ясно, когда ожидать null в других местах. Тем более, что документация для getResultList гласит Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. Конечно, я бы все равно проверил null и, если нужно, сам вернул бы пустой список. - person René; 29.01.2018

Если бы в спецификациях было сказано, что этого не может быть, поверили бы вы им? Учитывая, что ваш код предположительно может работать с различными реализациями JPA, доверяете ли вы каждому разработчику, чтобы сделать его правильно?

Несмотря ни на что, я бы кодировал оборонительно и проверял на ноль.

Теперь большой вопрос: должны ли мы рассматривать «null» и пустой список как синонимы? Здесь спецификации должны нам помочь, а не помочь.

Я предполагаю, что нулевой возврат (если это действительно может произойти) будет эквивалентен «Я не понял запрос», а пустой список будет «да, понял запрос, но записей не было».

Возможно, у вас есть путь кода (вероятно, исключение), который имеет дело с неразборчивыми запросами, я бы предпочел направить нулевой возврат по этому пути.

person djna    schedule 12.07.2009
comment
+1 вы совершенно правы, когда говорите: вы бы доверяли каждому провайдеру JPA? НЕТ :) - person dfa; 12.07.2009
comment
Отредактировано для добавления: Артур указал, что JPA Hibernate фактически возвращает значение null, если записи не найдены. Так что на самом деле в этом случае нам нужно сложить вместе нулевой и пустой список. Я считаю, что мыслительный процесс, через который мы прошли выше, по-прежнему актуален. Возможно даже, что у нас должны быть разные трактовки null для разных стеков JPA. Добро пожаловать в мир портативности. - person djna; 12.07.2009
comment
Согласованный. Существует только забава переносимости из-за того, что спецификация JPA не делает то, что должна делать... укажите точную семантику. Жаль, что им управляет комитет с корыстными интересами. - person DataNucleus; 13.07.2009
comment
Я не понял, что запрос должен обрабатываться как Exception, возвращая null, где Collection в возвращаемом типе, является очевидным недостатком дизайна. - person matoni; 20.06.2019

Вопреки сообщению Артура, когда я на самом деле выполнил запрос, который не соответствовал ни одной сущности, я получил пустой список, а не нуль. Это использование Hibernate, и это то, что я считаю правильным поведением: пустой список является правильным ответом, когда вы запрашиваете набор сущностей, а их нет.

person Andrew Simons    schedule 30.11.2009
comment
для OpenJPA я также получаю пустой список вместо нуля. - person Gnavvy; 25.01.2011

Если вы внимательно посмотрите на org.hibernate.loader.Loader (4.1), вы увидите, что список всегда инициализируется внутри метода processResultSet() (doc, источник).

protected List processResultSet(...) throws SQLException {
   final List results = new ArrayList();

   handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
   ...
   return results;

}

Поэтому я не думаю, что теперь он вернет null.

person Charles Follet    schedule 12.05.2016
comment
Спасибо за точный фрагмент кода. Но этот ответ фокусируется только на спящем режиме, который является одной из реализаций спецификации. Другие реализации, такие как OpenJPA, отличаются своим поведением. Кроме того, спящий режим, похоже, изменил поведение в разных версиях. - person venky; 07.02.2017

Конечно, если вы протестируете результирующий набор с помощью CollectionUtils.isNotEmpty от Jakarta, вы застрахованы в любом случае.

person Al Scherer    schedule 08.01.2010

Query.getResultList() возвращает пустой список вместо null. Поэтому проверьте isEmpty() в возвращаемом результате и продолжите остальную часть логики, если она ложна.

person Cyril Sojan    schedule 14.03.2019

Учитывая реализацию getResultsList() в классе org.hibernate.ejb.QueryImpl, можно вернуть null :

public List getResultList() {
    try {
        return query.list();
    }
    catch (QueryExecutionRequestException he) {
        throw new IllegalStateException(he);
    }
    catch( TypeMismatchException e ) {
        throw new IllegalArgumentException(e);
    }
    catch (HibernateException he) {
        em.throwPersistenceException( he );
        return null;
    }

Моя спящая версия: 3.3.1.GA

person wile the coyote    schedule 22.04.2019