И если да, то при каких обстоятельствах?
Спецификация Javadoc и JPA ничего не говорит.
И если да, то при каких обстоятельствах?
Спецификация Javadoc и JPA ничего не говорит.
Ты прав. Спецификация JPA ничего не говорит об этом. Но Java Persistence with Hibernate book, 2-е издание говорит:
Если результат запроса пуст, возвращается null
Реализация Hibernate JPA (Entity Manager) возвращает значение null, когда вы вызываете query.getResultList() без результата.
ОБНОВЛЕНИЕ
Как отмечают некоторые пользователи, кажется, что новейшая версия Hibernate вместо этого возвращает пустой список.
Пустой список также возвращается в Eclipselink, если результаты не найдены.
if(rows == null || rows.size == 0){}
где rows — это то, что возвращает getResultList()
- person Number945; 22.05.2017
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» и пустой список как синонимы? Здесь спецификации должны нам помочь, а не помочь.
Я предполагаю, что нулевой возврат (если это действительно может произойти) будет эквивалентен «Я не понял запрос», а пустой список будет «да, понял запрос, но записей не было».
Возможно, у вас есть путь кода (вероятно, исключение), который имеет дело с неразборчивыми запросами, я бы предпочел направить нулевой возврат по этому пути.
Exception
, возвращая null
, где Collection
в возвращаемом типе, является очевидным недостатком дизайна.
- person matoni; 20.06.2019
Вопреки сообщению Артура, когда я на самом деле выполнил запрос, который не соответствовал ни одной сущности, я получил пустой список, а не нуль. Это использование 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.
Конечно, если вы протестируете результирующий набор с помощью CollectionUtils.isNotEmpty от Jakarta, вы застрахованы в любом случае.
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