Відповіді:
Ти правий. Специфікація JPA про це нічого не говорить. Але наполегливість Java з книгою "Зимова сплячка", 2-е видання , говорить:
Якщо результат запиту порожній, нуль повертається
Реалізація системи Hibernate JPA (Entity Manager) повертає нуль, коли ви викликаєте 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
, що відповідає, є очевидним недоліком дизайну
На відміну від публікації Артура, коли я фактично запускав запит, який не відповідає жодним особам, я отримав порожній список, не нульовий. Це використання 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;
}
Тож я не думаю, що зараз вона повернеться до нуля.
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