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

Lesezeit: 4 Minuten

Und wenn ja, unter welchen Umständen?

Javadoc- und JPA-Spezifikation sagt nichts.

  • Genau diese Frage habe ich gesucht! tks! up 4 du!

    – Rafa Ferreira

    2. Juni 2010 um 14:54 Uhr

Benutzer-Avatar
Artur Ronald

Sie haben Recht. Die JPA-Spezifikation sagt nichts darüber aus. Aber Buch Java Persistence with Hibernate, 2. Auflagesagt:

Wenn das Abfrageergebnis leer ist, wird eine Null zurückgegeben

Die Hibernate-JPA-Implementierung (Entity Manager) gibt null zurück, wenn Sie query.getResultList() ohne Ergebnis aufrufen.

AKTUALISIEREN

Wie einige Benutzer darauf hingewiesen haben, scheint eine neueste Version von Hibernate stattdessen eine leere Liste zurückzugeben.

Auch in Eclipselink wird eine leere Liste zurückgegeben, wenn keine Ergebnisse gefunden werden.

  • Das ist sicherlich veraltet, Hibernate gibt eine leere Liste zurück.

    – Michael Laffargue

    17. Juni 2013 um 15:11 Uhr

  • 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

    25. Juni 2015 um 13:52 Uhr

  • Überprüfen Sie einfach beide Bedingungen mit OR. if(rows == null || rows.size == 0){} wobei rows das ist, was getResultList() zurückgibt

    – Nummer 945

    22. Mai 2017 um 18:49 Uhr

  • Wickeln Sie es einfach in ein Optional.ofNullable() ein und Sie sind fertig.

    – de.la.ru

    22. September 2017 um 14:01 Uhr

  • Ich glaube zurück null anstelle einer leeren Liste ist nicht das, was von der Spezifikation beabsichtigt ist, da es sonst ziemlich klar macht, wann zu erwarten ist null an anderen Orten. Zumal die Dokumentation z getResultList liest Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. würde ich noch prüfen null natürlich und gebe bei Bedarf selbst eine leere Liste zurück.

    – Rene

    29. Januar 2018 um 11:09 Uhr

Wenn die Spezifikationen sagten, dass es nicht passieren könnte, würden Sie ihnen glauben? Angesichts der Tatsache, dass Ihr Code möglicherweise mit vielen verschiedenen JPA-Implementierungen ausgeführt werden könnte, würden Sie jedem Implementierer vertrauen, dass er es richtig macht?

Egal was, ich würde defensiv codieren und auf null prüfen.

Nun die große Frage: Sollen wir “null” und eine leere Liste als synonym behandeln? Hier sollten uns die Spezifikationen helfen und tun es nicht.

Meine Vermutung ist, dass eine Nullrückgabe (falls dies tatsächlich passieren könnte) äquivalent zu “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 parsbaren Abfragen befasst. Ich würde dazu neigen, eine Nullrückgabe auf diesen Pfad zu leiten.

  • +1 Sie haben so recht, wenn Sie sagen: “Würden Sie jedem JPA-Anbieter vertrauen?” NEIN 🙂

    – dfa

    12. Juli 2009 um 8:03 Uhr

  • 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 tatsächlich null und leere Liste zusammenfalten. Ich glaube, dass der Denkprozess, den wir oben durchgegangen sind, immer noch gültig ist. Es ist sogar denkbar, dass wir für verschiedene JPA-Stacks unterschiedliche Behandlungen von null haben sollten. Willkommen beim Portabilitätsspaß.

    – DJNA

    12. Juli 2009 um 8:06 Uhr

  • Einverstanden. Es gibt nur “Portabilitätsspaß”, weil die JPA-Spezifikation nicht das tut, was sie tun sollte … die genaue Semantik angeben. Schade, dass es von einem Komitee mit Eigeninteressen geführt wird.

    – DataNucleus

    13. Juli 2009 um 18:48 Uhr

  • “Ich habe die Abfrage nicht verstanden” sollte so behandelt werden ExceptionRückkehr null wo Collection Der Rückgabetyp ist ein offensichtlicher Konstruktionsfehler

    – matoni

    20. Juni 2019 um 20:30 Uhr


Im Gegensatz zu Arthurs Beitrag, als ich tatsächlich eine Abfrage durchführte, bei der keine Entitäten übereinstimmten, erhielt ich eine leere Liste, nicht null. Dies verwendet Hibernate und ist das, was ich für korrektes Verhalten halte: Eine leere Liste ist die richtige Antwort, wenn Sie nach einer Sammlung von Entitäten fragen und es keine gibt.

  • für OpenJPA bekomme ich auch eine leere Liste statt null.

    – Gnavvy

    25. Januar 2011 um 4:18 Uhr

Benutzer-Avatar
Karl Follet

Wenn man sich das genau anschaut org.hibernate.loader.Loader (4.1) sehen Sie, dass die Liste immer innerhalb der Methode processResultSet() initialisiert wird (Dok, Quelle).

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ückgeben wird.

Wenn Sie die Ergebnismenge mit CollectionUtils.isNotEmpty von Jakarta testen, sind Sie natürlich so oder so abgesichert.

Benutzer-Avatar
Skomisa

Query.getResultList() gibt stattdessen eine leere Liste zurück null. Also prüfen isEmpty() im zurückgegebenen Ergebnis und fahren Sie mit dem Rest der Logik fort, wenn es falsch ist.

Benutzer-Avatar
wil der Kojote

Angesichts der Umsetzung von getResultsList() in org.hibernate.ejb.QueryImpl Klasse, es ist möglich, a 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 Hibernate-Version ist: 3.3.1.GA

1332730cookie-checkKann javax.persistence.Query.getResultList() null zurückgeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy