Может javax.persistence.Query.getResultList() вернуть null?

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

Спектр Javadoc и JPA ничего не говорит.

Ответ 1

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

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

Реализация спящего режима JPA (Entity Manager) возвращает null при вызове query.getResultList() без результата.

ОБНОВИТЬ

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

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

Ответ 2

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

Независимо от того, я бы закодировал бы защитный код и проверил бы на нуль.

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

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

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

Ответ 3

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

Ответ 4

Если вы внимательно посмотрите на 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.

Ответ 5

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

Ответ 6

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

Ответ 7

Учитывая реализацию 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