Это определенно устарело, Hibernate возвращает пустой список.
Майкл Лаффарг
2
Я все еще получаю null из Hibernate 4.3.10 (работающего как движок JPA для Spring Data). Это происходит только для одного собственного запроса, поскольку типичные запросы JPA работают должным образом.
Jacek Prucia
1
Просто проверьте оба условия с помощью ИЛИ. if(rows == null || rows.size == 0){}где строки - это то, что возвращает getResultList ()
Number945,
Просто оберните его в Optional.ofNullable (), и все готово.
de.la.ru
Я считаю, что возвращение 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конечно, и сам верну пустой список, если нужно.
René
23
Если бы в спецификациях говорилось, что этого не может быть, вы бы поверили им? Учитывая, что ваш код предположительно может работать с различными реализациями JPA, доверяете ли вы каждому разработчику, который сделает это правильно?
Несмотря ни на что, я бы написал защитный код и проверил значение null.
Теперь большой вопрос: следует ли рассматривать «нуль» и пустой список как синонимы? Здесь спецификации должны нам помочь, а не нет.
Я предполагаю, что нулевой возврат (если это действительно может произойти) будет эквивалентен «Я не понял запрос», а пустой список будет «да, понял запрос, но не было записей».
Возможно, у вас есть кодовый путь (вероятно, исключение), который имеет дело с неразборчивыми запросами, я бы предпочел направить нулевой возврат по этому пути.
+1 Вы так правы, когда говорите: "Вы бы доверяли каждому провайдеру JPA?" НЕТ :)
dfa
Отредактировано для добавления: Артур указал, что JPA Hibernate на самом деле возвращает null, если записи не найдены. Фактически, в этом случае нам действительно нужно сложить пустой и пустой список. Я считаю, что мыслительный процесс, который мы прошли выше, все еще в силе. Возможно даже, что у нас должны быть разные обработки null для разных стеков JPA. Добро пожаловать в мир портативных игр.
djna
Согласовано. Существует только "забавная переносимость" из-за того, что спецификация JPA не выполняет то, что должна делать ... указать точную семантику. Жаль, что им управляет комитет с корыстными интересами.
DataNucleus
2
«Я не понял запрос» следует рассматривать, так как Exceptionвозвращение, nullгде Collectionнаходится в возвращаемом типе, является очевидным недостатком дизайна
Матони
13
Вопреки сообщению Артура, когда я действительно выполнил запрос, по которому не было найдено ни одного объекта, я получил пустой список, а не null. Здесь используется Hibernate, и это то, что я считаю правильным поведением: пустой список - это правильный ответ, когда вы запрашиваете набор сущностей, а их нет.
для OpenJPA я также получаю пустой список вместо нуля.
Gnavvy
3
Если вы внимательно посмотрите на org.hibernate.loader.Loader(4.1), вы увидите, что список всегда инициализируется внутри метода processResultSet () ( doc , source ).
Приветствую вас за точный фрагмент кода. Но этот ответ сосредоточен только на спящем режиме, который является одной из реализаций спецификации. Другие реализации, такие как OpenJPA, отличаются своим поведением. Кроме того, похоже, что спящий режим изменил поведение в разных версиях.
Venky
1
Конечно, если вы протестируете набор результатов с помощью Jakarta's CollectionUtils.isNotEmpty, вы в любом случае будете защищены.
Query.getResultList()возвращает пустой список вместо null. Так что проверьте isEmpty()возвращенный результат и продолжите остальную логику, если он ложный.
Учитывая реализацию getResultsList()in org.hibernate.ejb.QueryImplclass, можно вернуть null:
publicList getResultList(){try{return query.list();}catch(QueryExecutionRequestException he){thrownewIllegalStateException(he);}catch(TypeMismatchException e ){thrownewIllegalArgumentException(e);}catch(HibernateException he){
em.throwPersistenceException( he );returnnull;}
Ответы:
Ты прав. Спецификация 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 ).Поэтому я не думаю, что сейчас он вернет null.
источник
Конечно, если вы протестируете набор результатов с помощью Jakarta's CollectionUtils.isNotEmpty, вы в любом случае будете защищены.
источник
Query.getResultList()
возвращает пустой список вместоnull
. Так что проверьтеisEmpty()
возвращенный результат и продолжите остальную логику, если он ложный.источник
Учитывая реализацию
getResultsList()
inorg.hibernate.ejb.QueryImpl
class, можно вернутьnull
:Моя версия гибернации: 3.3.1.GA
источник