Kann javax.persistence.Query.getResultList () null zurückgeben?

115

Und wenn ja, unter welchen Umständen?

Javadoc und JPA-Spezifikation sagt nichts.

rdk
quelle
Ich habe genau diese Frage gesucht! tks! bis 4 Sie!
rafa.ferreira

Antworten:

69

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.

Arthur Ronald
quelle
29
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.

djna
quelle
+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.

Andrew Simons
quelle
2
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 .

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.

Charles Follet
quelle
2
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.

Al Scherer
quelle
0

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.

Cyril Sojan
quelle
0

Aufgrund der Implementierung von getResultsList()in org.hibernate.ejb.QueryImplclass 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.

während der Kojote
quelle