Чи може javax.persistent.Query.getResultList () повернути нуль?


115

І якщо так, то за яких обставин?

Спеціалізація Javadoc та JPA нічого не говорить.


Я шукав саме це питання! tks! до 4 ви!
rafa.ferreira

Відповіді:


69

Ти правий. Специфікація JPA про це нічого не говорить. Але наполегливість Java з книгою "Зимова сплячка", 2-е видання , говорить:

Якщо результат запиту порожній, нуль повертається

Реалізація системи Hibernate JPA (Entity Manager) повертає нуль, коли ви викликаєте query.getResultList () без результату.

ОНОВЛЕННЯ

Як зазначають деякі користувачі, схоже, що найновіша версія Hibernate натомість повертає порожній список.

Порожній список повертається і в Eclipselink, коли результати не знайдені.


29
Це, безумовно, застаріло, сплячка повертає порожній список.
Майкл Лаффарг

2
Я все ще отримую null від Hibernate 4.3.10 (працює як двигун JPA для Spring Data). Це відбувається лише для одного власного запиту, оскільки типові запити JPA працюють так, як очікувалося.
Яцек Пруція

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звичайно, і повертаю порожній список, якщо потрібно.
Рене

23

Якби специфікації сказали, що це не може статися, ти повіриш їм? З огляду на те, що ваш код може протистояти різним реалізаціям JPA, чи довіритесь ви кожному виконавцеві, щоб правильно його встановити?

Незважаючи ні на що, я б кодував оборонно і перевіряв на нуль.

Тепер велике питання: чи слід трактувати "null" та порожній список як синонім? Тут технічні характеристики повинні нам допомогти, а не зробити.

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

Можливо, у вас є кодовий шлях (швидше за все, виняток), який стосується незмінних запитів, я схильний би направити нульове повернення вниз по цьому шляху.


+1 ви так праві, говорячи: "чи довіритесь ви кожному постачальнику послуг JPA?" НЕ :)
dfa

Відредаговано, щоб додати: Артур вказував, що Спільна програма Спільної Гібернатури насправді повертає нуль, якщо не знайдено жодної записи. Тому насправді нам потрібно скласти нульовий та порожній список. Я вважаю, що мисленнєвий процес, який ми пройшли вище, все ще діє. Можна навіть думати, що ми повинні мати різні трактування нуля для різних стеків JPA. Ласкаво просимо до розваг про мобільність
djna

Домовились. Існує лише "забава з портативністю" завдяки специфікації JPA, яка не робить того, що повинна робити ... уточнити точну семантику. Соромно, що ним керує комітет із зацікавленими інтересами.
DataNucleus

2
"Я не розумів запит" слід обробляти, оскільки Exceptionповернення nullтуди Collection, що відповідає, є очевидним недоліком дизайну
matoni

13

На відміну від публікації Артура, коли я фактично запускав запит, який не відповідає жодним особам, я отримав порожній список, не нульовий. Це використання Hibernate і я вважаю правильною поведінку: порожній список - це правильна відповідь, коли ви запитуєте колекцію сутностей, а таких немає.


2
для OpenJPA я також отримую порожній список замість null.
Гнаввій

3

Якщо ви уважно подивіться на 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;

}

Тож я не думаю, що зараз вона повернеться до нуля.


2
Привітайте за точний фрагмент коду. Але ця відповідь зосереджена на просто сплячому режимі, що є однією з реалізацій специфікації. Інші реалізації, такі як OpenJPA, відрізняються поведінкою. Також сплячий стан, схоже, змінив поведінку в різних версіях.
venky

1

Звичайно, якщо ви протестуєте набір результатів у колекції Jakarta's CollectionUtils.isNotEmpty, ви охоплені в будь-якому випадку.


0

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


0

З огляду на реалізацію 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.