И если да, то при каких обстоятельствах?
Спектр Javadoc и JPA ничего не говорит.
И если да, то при каких обстоятельствах?
Спектр Javadoc и JPA ничего не говорит.
Вы правы. Спецификация JPA ничего не говорит об этом. Но Java Persistence с книгой Hibernate, 2-е издание, гласит:
Если результат запроса пуст, возвращается ноль
Реализация спящего режима JPA (Entity Manager) возвращает null при вызове query.getResultList() без результата.
ОБНОВИТЬ
Как указывают некоторые пользователи, похоже, что новейшая версия Hibernate возвращает пустой список.
Пустой список возвращается и в Eclipselink, если результаты не найдены.
Если спецификации сказали, что этого не случилось, не могли бы вы их поверить? Учитывая, что ваш код, возможно, может работать против различных версий JPA, вы бы доверяли каждому разработчику, чтобы он правильно понял?
Независимо от того, я бы закодировал бы защитный код и проверил бы на нуль.
Теперь большой вопрос: следует ли рассматривать "null" и пустой список как синоним? Здесь спецификации должны помочь нам, и не делайте этого.
Я предполагаю, что нулевой возврат (если это действительно произойдет) будет эквивалентен "я не понял запрос", а пустой список будет "да, понял запрос, но не было записей".
Возможно, у вас есть путь к коду (вероятно, исключение), который имеет дело с неповторимыми запросами, я бы склонен направлять нулевой возврат вниз по этому пути.
Вопреки сообщению Arthur, когда я на самом деле выполнял запрос, который не совпал с сущностью, я получил пустой список, а не null. Это использование Hibernate, и это то, что я считаю правильным: пустой список является правильным ответом, когда вы запрашиваете коллекцию сущностей и их нет.
Если вы внимательно посмотрите на 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.
Конечно, если вы проверите набор результатов с помощью Jakarta CollectionUtils.isNotEmpty, вы будете охвачены в любом случае.
Query.getResultList()
возвращает пустой список вместо null
. Поэтому проверьте isEmpty()
в возвращаемом результате и продолжайте с остальной логикой, если оно ложно.
Учитывая реализацию 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