Вопрос по java, jpa, hibernate – Может ли javax.persistence.Query.getResultList () вернуть ноль?

107

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

В спецификации Javadoc и JPA ничего не сказано.

Я искал именно этот вопрос! ТКС! до 4 ты! rafa.ferreira

Ваш Ответ

6   ответов
0

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

1

если вы тестируете набор результатов с помощью Jakarta's CollectionUtils.isNotEmpty, вы покрываете оба варианта.

66

Java Persistence with Hibernate book, 2nd editionговорит:

If the query result is empty, a null is returned

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

UPDATE

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

Просто оберните его в Optional.ofNullable (), и вы установите его.
Просто проверьте оба условия, используя ИЛИ.if(rows == null || rows.size == 0){} где row это то, что возвращает getResultList ()
Я все еще получаю ноль от Hibernate 4.3.10 (работает как движок JPA для Spring Data). Это происходит только для одного собственного запроса, так как типичные запросы JPA работают как положено.
Это, безусловно, устарело, Hibernate возвращает пустой список.
С какой версии?
13

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

для OpenJPA я также получаю пустой список вместо нуля.
21

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

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

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

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

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

+1 вы так правы, когда говорите: «Вы бы доверяли каждому провайдеру JPA?» НЕТ :)
Согласовано. Существует только «удовольствие от переносимости» из-за того, что спецификация JPA не делает то, что должна делать ... указать точную семантику Позор, это управляется комитетом с корыстными интересами.
Отредактировано, чтобы добавить: Артур указал, что JPA Hibernate фактически возвращает ноль, если никакие записи не найдены. Так что на самом деле в этом случае нам нужно сложить нулевой и пустой список. Я считаю, что мыслительный процесс, который мы прошли выше, все еще действителен. Можно даже предположить, что для разных стеков JPA мы должны по-разному относиться к нулю. Добро пожаловать в переносимость веселья.
3

org.hibernate.loader.Loader (4.1) вы увидите, что список всегда инициализируется внутри метода processResultSet () (доктор, источник).

protected List processResultSet(...) throws SQLException {
   final List results = new ArrayList();

   handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
   ...
   return results;

}

Так что я не думаю, что сейчас он вернется к нулю.

Приветствия для точного фрагмента кода. Но этот ответ сфокусирован на спящем режиме, который является одной из реализаций спецификации. Другие реализации, такие как OpenJPA, отличаются своим поведением. Кроме того, похоже, что hibernate изменил поведение в разных версиях.

Похожие вопросы