Antworten:
Du hast recht. Die JPA-Spezifikation sagt nichts darüber aus. Aber Java Persistence with Hibernate-Buch, 2. Auflage , sagt:
Wenn das Abfrageergebnis leer ist, wird eine Null zurückgegeben
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.
if(rows == null || rows.size == 0){}
wo Zeilen ist, was die getResultList () zurückgibt
null
anstelle einer leeren Liste nicht das ist, was die Spezifikation vorsieht, da es sonst ziemlich klar macht, wann an null
anderen Orten zu erwarten ist . Zumal die Dokumentation zum getResultList
Lesen Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. Ich würde null
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.
Exception
, zurückkehren , null
wo Collection
in Rückgabetyp ist offensichtlich , dass die Konstruktionsfehler
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.
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 .
protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();
handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;
}
Ich glaube also nicht, dass es jetzt null zurückgibt.
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.QueryImpl
class ist es möglich, Folgendes zurückzugeben 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;
}
Meine Version im Ruhezustand ist: 3.3.1.GA.