Dies ist sicherlich veraltet, Hibernate gibt eine leere Liste zurück.
Michael Laffargue
2
Ich bekomme immer noch null von Hibernate 4.3.10 (läuft als JPA-Engine für Spring Data). Dies geschieht nur für eine einzelne native Abfrage, da typische JPA-Abfragen wie erwartet funktionieren.
Jacek Prucia
1
Überprüfen Sie einfach beide Bedingungen mit OR. if(rows == null || rows.size == 0){}wo Zeilen ist, was die getResultList () zurückgibt
Number945
Wickeln Sie es einfach in ein Optional.ofNullable () und Sie sind fertig.
de.la.ru
Ich glaube, dass die Rückkehr nullanstelle einer leeren Liste nicht das ist, was die Spezifikation vorsieht, da es sonst ziemlich klar macht, wann an nullanderen Orten zu erwarten ist . Zumal die Dokumentation zum getResultListLesen Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. Ich würde nullnatürlich immer noch nachsehen und bei Bedarf selbst eine leere Liste zurücksenden.
René
23
Wenn die Spezifikationen besagten, dass es nicht passieren könnte, würden Sie ihnen glauben? Würden Sie angesichts der Tatsache, dass Ihr Code möglicherweise gegen verschiedene JPA-Implementierungen ausgeführt werden könnte, jedem Implementierer vertrauen, dass er es richtig macht?
Egal was, ich würde defensiv codieren und nach Null suchen.
Nun die große Frage: Sollen wir "null" und eine leere Liste als synonym behandeln? Hier sollten uns die Spezifikationen helfen und nicht.
Ich vermute, dass eine Null-Rückgabe (falls dies tatsächlich passieren könnte) gleichbedeutend mit "Ich habe die Abfrage nicht verstanden" und eine leere Liste "Ja, habe die Abfrage verstanden, aber es gab keine Datensätze" wäre.
Sie haben vielleicht einen Codepfad (wahrscheinlich eine Ausnahme), der sich mit nicht analysierbaren Abfragen befasst. Ich würde dazu neigen, eine Nullrückgabe über diesen Pfad zu leiten.
+1 Sie haben so Recht, wenn Sie sagen: "Würden Sie jedem JPA-Anbieter vertrauen?" NEIN :)
dfa
Bearbeitet, um hinzuzufügen: Arthur hat darauf hingewiesen, dass Hibernates JPA tatsächlich null zurückgibt, wenn keine Datensätze gefunden werden. In diesem Fall müssen wir also die Null- und die leere Liste zusammenfalten. Ich glaube, dass der Denkprozess, den wir oben durchlaufen haben, immer noch gültig ist. Es ist sogar denkbar, dass wir für verschiedene JPA-Stapel unterschiedliche Nullbehandlungen haben sollten. Willkommen bei Portability Fun.
DJNA
Einverstanden. Es gibt nur "Portabilitätsspaß", weil die JPA-Spezifikation nicht das tut, was sie tun soll ... Geben Sie die genaue Semantik an. Schade, dass es von einem Ausschuss mit Interessenbindungen geleitet wird.
DataNucleus
2
„Ich habe nicht verstanden Abfrage“ als behandelt wurde Exception, zurückkehren , nullwo Collectionin Rückgabetyp ist offensichtlich , dass die Konstruktionsfehler
Matoni
13
Im Gegensatz zu Arthurs Beitrag erhielt ich eine leere Liste, nicht null, als ich tatsächlich eine Abfrage ausführte, mit der keine Entitäten übereinstimmten. Dies verwendet den Ruhezustand und ist meines Erachtens das richtige Verhalten: Eine leere Liste ist die richtige Antwort, wenn Sie nach einer Sammlung von Entitäten fragen und es keine gibt.
Für OpenJPA erhalte ich auch eine leere Liste anstelle von null.
Gnavvy
3
Wenn Sie sich org.hibernate.loader.Loader(4.1) genauer ansehen, werden Sie feststellen, dass die Liste immer innerhalb der processResultSet () -Methode ( doc , source ) initialisiert wird .
Prost auf das genaue Code-Snippet. Diese Antwort konzentriert sich jedoch nur auf den Ruhezustand, der eine der Implementierungen der Spezifikation darstellt. Andere Implementierungen wie OpenJPA unterscheiden sich im Verhalten. Außerdem scheint der Ruhezustand das Verhalten gegenüber verschiedenen Versionen geändert zu haben.
Venky
1
Wenn Sie die Ergebnismenge mit Jakartas CollectionUtils.isNotEmpty testen, sind Sie natürlich in beiden Fällen abgesichert.
Query.getResultList()gibt eine leere Liste anstelle von zurück null. Überprüfen Sie also isEmpty()das zurückgegebene Ergebnis und fahren Sie mit dem Rest der Logik fort, wenn es falsch ist.
Aufgrund der Implementierung von getResultsList()in org.hibernate.ejb.QueryImplclass ist es möglich, Folgendes zurückzugeben null:
publicList getResultList(){try{return query.list();}catch(QueryExecutionRequestException he){thrownewIllegalStateException(he);}catch(TypeMismatchException e ){thrownewIllegalArgumentException(e);}catch(HibernateException he){
em.throwPersistenceException( he );returnnull;}
Antworten:
Du hast recht. Die JPA-Spezifikation sagt nichts darüber aus. Aber Java Persistence with Hibernate-Buch, 2. Auflage , sagt:
Die JPA-Implementierung im Ruhezustand (Entity Manager) gibt null zurück, wenn Sie query.getResultList () ohne Ergebnis aufrufen.
AKTUALISIEREN
Wie einige Benutzer betonten, scheint eine neueste Version von Hibernate stattdessen eine leere Liste zurückzugeben.
Eine leere Liste wird auch in Eclipselink zurückgegeben, wenn keine Ergebnisse gefunden werden.
quelle
if(rows == null || rows.size == 0){}
wo Zeilen ist, was die getResultList () zurückgibtnull
anstelle einer leeren Liste nicht das ist, was die Spezifikation vorsieht, da es sonst ziemlich klar macht, wann annull
anderen Orten zu erwarten ist . Zumal die Dokumentation zumgetResultList
LesenExecute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. Ich würdenull
natürlich immer noch nachsehen und bei Bedarf selbst eine leere Liste zurücksenden.Wenn die Spezifikationen besagten, dass es nicht passieren könnte, würden Sie ihnen glauben? Würden Sie angesichts der Tatsache, dass Ihr Code möglicherweise gegen verschiedene JPA-Implementierungen ausgeführt werden könnte, jedem Implementierer vertrauen, dass er es richtig macht?
Egal was, ich würde defensiv codieren und nach Null suchen.
Nun die große Frage: Sollen wir "null" und eine leere Liste als synonym behandeln? Hier sollten uns die Spezifikationen helfen und nicht.
Ich vermute, dass eine Null-Rückgabe (falls dies tatsächlich passieren könnte) gleichbedeutend mit "Ich habe die Abfrage nicht verstanden" und eine leere Liste "Ja, habe die Abfrage verstanden, aber es gab keine Datensätze" wäre.
Sie haben vielleicht einen Codepfad (wahrscheinlich eine Ausnahme), der sich mit nicht analysierbaren Abfragen befasst. Ich würde dazu neigen, eine Nullrückgabe über diesen Pfad zu leiten.
quelle
Exception
, zurückkehren ,null
woCollection
in Rückgabetyp ist offensichtlich , dass die KonstruktionsfehlerIm Gegensatz zu Arthurs Beitrag erhielt ich eine leere Liste, nicht null, als ich tatsächlich eine Abfrage ausführte, mit der keine Entitäten übereinstimmten. Dies verwendet den Ruhezustand und ist meines Erachtens das richtige Verhalten: Eine leere Liste ist die richtige Antwort, wenn Sie nach einer Sammlung von Entitäten fragen und es keine gibt.
quelle
Wenn Sie sich
org.hibernate.loader.Loader
(4.1) genauer ansehen, werden Sie feststellen, dass die Liste immer innerhalb der processResultSet () -Methode ( doc , source ) initialisiert wird .Ich glaube also nicht, dass es jetzt null zurückgibt.
quelle
Wenn Sie die Ergebnismenge mit Jakartas CollectionUtils.isNotEmpty testen, sind Sie natürlich in beiden Fällen abgesichert.
quelle
Query.getResultList()
gibt eine leere Liste anstelle von zurücknull
. Überprüfen Sie alsoisEmpty()
das zurückgegebene Ergebnis und fahren Sie mit dem Rest der Logik fort, wenn es falsch ist.quelle
Aufgrund der Implementierung von
getResultsList()
inorg.hibernate.ejb.QueryImpl
class ist es möglich, Folgendes zurückzugebennull
:Meine Version im Ruhezustand ist: 3.3.1.GA.
quelle