2009-07-12 9 views

Odpowiedz

57

Masz rację. Specyfikacja JPA nic o tym nie mówi. Ale Java Persistence z Hibernate książki, 2nd edition, mówi:

Jeśli wynik zapytania jest pusta, zwracana jest wartość null

realizacja

Hibernate JPA (Entity Manager) zerowy powrotny po wywołaniu zapytania .getResultList() bez wyniku.

UPDATE

Jak podkreślił niektórych użytkowników, wydaje się, że najnowsza wersja Hibernate zwraca pustą listę zamiast.

+19

To jest z pewnością nieaktualne, Hibernate zwraca pustą listę. –

+4

Od jakiej wersji? – Tom

+1

Nadal dostaję null z Hibernuj 4.3.10 (działa jako silnik JPA dla danych sprężyn). Dzieje się tak tylko w przypadku pojedynczego zapytania natywnego, ponieważ typowe zapytania JPA działają zgodnie z oczekiwaniami. –

20

Jeśli specyfikacja mówi, że nie może się zdarzyć, czy uwierzyłbyś im? Biorąc pod uwagę, że twój kod mógłby być uruchamiany przeciwko różnym implementacjom JPA, czy zaufałbyś każdemu wdrażającemu, aby to naprawić?

Bez względu na to, kodowałem defensywnie i sprawdzałem pod kątem zerowej wartości.

Teraz najważniejsze pytanie: czy powinniśmy traktować "zero" i pustą listę jako synonimy? To tam specyfikacja powinna nam pomóc, a nie.

Domyślam się, że zerowy zwrot (jeśli w ogóle może się zdarzyć) byłby równoważny "Nie zrozumiałem zapytania", a pusta lista byłaby "tak, zrozumiała zapytanie, ale nie było żadnych rekordów".

Prawdopodobnie masz ścieżkę kodu (prawdopodobnie wyjątek), która zajmuje się niepodobnymi zapytaniami, chciałbym skierować zerowy zwrot w dół tej ścieżki.

+0

+1 masz rację mówiąc: "czy ufasz każdemu dostawcy JPA?" NIE :) – dfa

+0

Edytowane w celu dodania: Arthur wskazał, że JPA Hibernate w rzeczywistości zwraca null, jeśli nie znaleziono rekordów. W rzeczywistości w tym przypadku musimy spasować listę pustą i pustą. Uważam, że proces myślowy, który przeszliśmy powyżej, jest nadal aktualny. Jest nawet możliwe, że powinniśmy mieć różne traktowanie wartości zerowej dla różnych stosów JPA. Witamy w zabawnej przenośności. – djna

+0

Uzgodnione. Istnieje tylko "przenośna zabawa", ponieważ specyfikacja JPA nie robi tego, co powinna ... określa dokładną semantykę.Szkoda, że ​​jest prowadzony przez komitet posiadający własne interesy. – DataNucleus

13

W przeciwieństwie do postu Artura, kiedy faktycznie uruchomiłem zapytanie, do którego nie pasowały żadne jednostki, dostałem pustą listę, a nie zero. Używa hibernacji i jest to, co uważam za prawidłowe zachowanie: pusta lista jest poprawną odpowiedzią, gdy pytasz o zbiór encji i nie ma żadnych.

+2

dla OpenJPA, ja również dostaję pustą listę zamiast wartości NULL. – Gnavvy

1

Oczywiście, jeśli przetestujesz zestaw wyników za pomocą kolekcji Jakarta CollectionUtils.isNotEmpty, zostaniesz objęty tą metodą.

1

Jeśli przyjrzysz się bliżej org.hibernate.loader.Loader (4.1), zobaczysz, że lista jest zawsze inicjowana 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 wartość zerową.

+2

Pozdrowienia za dokładny fragment kodu. Ale ta odpowiedź skupia się tylko na hibernacji, która jest jedną z implementacji specyfikacji. Inne implementacje, takie jak OpenJPA, różnią się tym zachowaniem. Ponadto wydaje się, że hibernacja zmieniła zachowanie w różnych wersjach. – venky

Powiązane problemy