Ответы:
Ты прав. Спецификация JPA ничего об этом не говорит. Но книга Java Persistence with Hibernate, 2-е издание , говорит:
Если результат запроса пуст, возвращается ноль
Реализация Hibernate JPA (Entity Manager) возвращает null, когда вы вызываете query.getResultList () без результата.
ОБНОВИТЬ
Как отмечают некоторые пользователи, кажется, что новейшая версия Hibernate вместо этого возвращает пустой список.
Пустой список также возвращается в Eclipselink, если результаты не найдены.
if(rows == null || rows.size == 0){}
где строки - это то, что возвращает getResultList ()
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
конечно, и сам верну пустой список, если нужно.
Если бы в спецификациях говорилось, что этого не может быть, вы бы поверили им? Учитывая, что ваш код предположительно может работать с различными реализациями JPA, доверяете ли вы каждому разработчику, который сделает это правильно?
Несмотря ни на что, я бы написал защитный код и проверил значение null.
Теперь большой вопрос: следует ли рассматривать «нуль» и пустой список как синонимы? Здесь спецификации должны нам помочь, а не нет.
Я предполагаю, что нулевой возврат (если это действительно может произойти) будет эквивалентен «Я не понял запрос», а пустой список будет «да, понял запрос, но не было записей».
Возможно, у вас есть кодовый путь (вероятно, исключение), который имеет дело с неразборчивыми запросами, я бы предпочел направить нулевой возврат по этому пути.
Exception
возвращение, null
где Collection
находится в возвращаемом типе, является очевидным недостатком дизайна
Вопреки сообщению Артура, когда я действительно выполнил запрос, по которому не было найдено ни одного объекта, я получил пустой список, а не null. Здесь используется Hibernate, и это то, что я считаю правильным поведением: пустой список - это правильный ответ, когда вы запрашиваете набор сущностей, а их нет.
Если вы внимательно посмотрите на org.hibernate.loader.Loader
(4.1), вы увидите, что список всегда инициализируется внутри метода processResultSet () ( doc , source ).
protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();
handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;
}
Поэтому я не думаю, что сейчас он вернет null.
Query.getResultList()
возвращает пустой список вместо null
. Так что проверьте isEmpty()
возвращенный результат и продолжите остальную логику, если он ложный.
Учитывая реализацию getResultsList()
in org.hibernate.ejb.QueryImpl
class, можно вернуть 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