Odpowiedzi:
Masz rację. Specyfikacja JPA nic o tym nie mówi. Ale Java Persistence with Hibernate book, 2nd edition , mówi:
Jeśli wynik zapytania jest pusty, zwracana jest wartość null
Implementacja Hibernate JPA (Entity Manager) zwraca wartość null, gdy wywołasz query.getResultList () bez wyniku.
AKTUALIZACJA
Jak zauważyli niektórzy użytkownicy, wydaje się, że najnowsza wersja Hibernate zwraca zamiast tego pustą listę.
W przypadku braku wyników zwracana jest również pusta lista w Eclipselink.
if(rows == null || rows.size == 0){}
gdzie wiersze są tym, co zwraca getResultList ()
null
zamiast pustej listy nie jest tym, co jest zamierzone w specyfikacji, ponieważ w przeciwnym razie jasno określa, kiedy można się spodziewać null
w innych miejscach. Zwłaszcza, że dokumentacja do getResultList
reads Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. null
Oczywiście nadal sprawdzałem i w razie potrzeby zwracałem pustą listę.
Gdyby specyfikacje mówiły, że to się nie może zdarzyć, uwierzyłbyś im? Biorąc pod uwagę, że Twój kod mógłby prawdopodobnie działać przeciwko różnym implementacjom JPA, czy ufasz każdemu wdrażającemu, że zrobi to dobrze?
Bez względu na wszystko, koduję defensywnie i sprawdzam, czy nie ma wartości null.
Teraz najważniejsze pytanie: czy „null” i pusta lista powinniśmy traktować jako synonimy? W tym przypadku specyfikacja powinna nam pomóc, a nie.
Domyślam się, że zwrot zerowy (jeśli rzeczywiście może się zdarzyć) byłby równoważny z „Nie zrozumiałem zapytania”, a pusta lista byłaby „tak, zrozumiałem zapytanie, ale nie było żadnych rekordów”.
Być może masz ścieżkę kodu (prawdopodobnie wyjątek), która zajmuje się zapytaniami, których nie można przeanalizować, miałbym tendencję do kierowania zerowego powrotu w dół tej ścieżki.
Exception
, że zwracanie null
gdzie Collection
jest w zwracanym typie jest oczywistą wadą projektową
W przeciwieństwie do posta Arthura, kiedy faktycznie wykonałem zapytanie, do którego nie pasowały żadne jednostki, otrzymałem pustą listę, a nie null. To używa Hibernacji i uważam, że to jest właściwe zachowanie: pusta lista jest poprawną odpowiedzią, gdy pytasz o kolekcję jednostek, a nie ma żadnych.
Jeśli przyjrzysz się bliżej org.hibernate.loader.Loader
(4.1), zobaczysz, że lista jest zawsze inicjalizowana wewnątrz metody processResultSet () ( doc , source ).
protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();
handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;
}
Więc nie sądzę, że teraz zwróci zero.
Oczywiście, jeśli przetestujesz zestaw wyników za pomocą CollectionUtils.isNotEmpty firmy Jakarta, jesteś objęty i tak.
Query.getResultList()
zwraca pustą listę zamiast null
. Więc sprawdź isEmpty()
zwrócony wynik i kontynuuj resztę logiki, jeśli jest fałszywa.
Biorąc pod uwagę implementację getResultsList()
w org.hibernate.ejb.QueryImpl
klasie, można zwrócić 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;
}
Moja wersja hibernacji to: 3.3.1.GA