javax.persistence.NoResultException: Keine Entität für Abfrage gefunden

Lesezeit: 4 Minuten

Benutzer-Avatar
WowBow

Bevor ich diese Frage gepostet habe, habe ich bereits nachgesehen, aber ich konnte nicht finden, wonach ich gesucht habe.

Ich weiß, dass für die von mir geschriebene Abfrage möglicherweise nur eine oder gar keine Zeile vorhanden ist. Es gibt also keinen Grund für mich zu verwenden getResultList().

Hier ist mein Code:

String hql="from DrawUnusedBalance where unusedBalanceDate= :today";
Query query=em.createQuery(hql);
query.setParameter("today",new LocalDate());

DrawUnusedBalance drawUnusedBalance= 
    (DrawUnusedBalance)query.getSingleResult();// we can have only a
                                               // single datum per day
//`System.out.println(drawUnusedBalance.toString());`

Das Problem ist, wenn es keine Zeile gibt, wird eine Ausnahme ausgelöst, und wenn nicht, funktioniert es gut. Ich kenne das Problem, aber ich suche auch nach der besten Lösung.

Was ich wollte, ist, wenn es keine Zeile in der DB gibt, wollte ich ein Nullobjekt erhalten (anstatt eine Ausnahme zu erhalten), also werde ich neue Daten einfügen, wenn es nicht null ist, möchte ich es nur aktualisieren.

Es gibt einen Weg, damit umzugehen, der meines Erachtens nicht der richtige Weg ist. Es ist: Ich werde einen Try-Catch-Block haben und wenn er eine Ausnahme auslöst, kann ich schreiben, um neue Daten in die DB auf dem Catch-Block einzufügen. Aber ich glaube, es wird einen besseren Weg geben.

Benutzer-Avatar
ManuPK

Ja. Sie müssen die verwenden try/catch blockieren, aber keine Notwendigkeit, die zu fangen Exception. Gemäß der API es wird werfen NoResultException wenn es kein Ergebnis gibt, und es liegt an Ihnen, wie Sie damit umgehen möchten.

DrawUnusedBalance drawUnusedBalance = null;
try{
drawUnusedBalance = (DrawUnusedBalance)query.getSingleResult()
catch (NoResultException nre){
//Ignore this because as per your logic this is ok!
}

if(drawUnusedBalance == null){
 //Do your logic..
}

  • Danke ManuPK … Aber ich muss noch etwas Code schreiben, der ein Objekt erstellt und eine DB persistiert … im Catch-Block … und ich dachte, das wäre kein guter Weg, um Daten aus einem Catch-Block zu persistieren … Obwohl tnx für Ihre Antwort.

    – WowBow

    15. November 2011 um 15:23 Uhr

  • Ich glaube, es ist nichts falsch daran, a zu fangen geprüfte Ausnahme und einen alternativen Weg gehen. Aus diesem Grund gibt Ihnen die JPA die Möglichkeit, wie Sie damit umgehen möchten. Tatsächlich ist die gesuchte Methode in verfügbar überwintern die mit JPA nicht verfügbar ist.

    – ManuPK

    15. November 2011 um 15:30 Uhr

  • @ user1017111 Ich habe Ihr Problem beim Schreiben von Code in die Fang. Ich habe die Antwort leicht aktualisiert, um den Code lesbar zu machen.

    – ManuPK

    15. November 2011 um 16:15 Uhr

  • Interessanterweise wird diese Lösung hier diskutiert: stackoverflow.com/questions/2002993/jpa-getsingleresult-or-null

    – Alex Barnes

    15. November 2011 um 16:41 Uhr

  • @ManuPK : javax.persistence.NoResultException ist keine geprüfte Ausnahme. Seine ungeprüfte Ausnahme.

    – Gunjan Schah

    31. Oktober 2012 um 10:58 Uhr

Wenn Sie Java 8 verwenden, können Sie die Stream-API nutzen und den Code vereinfachen

return (YourEntityClass) entityManager.createQuery()
....
.getResultList()
.stream().findFirst();

Dadurch erhalten Sie java.util.Optional

Wenn Sie stattdessen null bevorzugen, brauchen Sie nur

 ...
.getResultList()
.stream().findFirst().orElse(null);

  • Die Frage bezieht sich auf getSingleResult()nicht zu .getResultList(). Es steht sogar in der Beschreibung.

    – Sergej Dubinin

    1. November 2019 um 11:09 Uhr

  • Er nimmt immer noch ein einzelnes Element ab getResultList() obwohl.

    – Felipe Mosso

    12. Juli 2021 um 23:25 Uhr

Sie erwähnten das Abrufen der Ergebnisliste aus der Abfrage, da Sie nicht wissen, dass es ein UniqueResult gibt (daher die Ausnahme), könnten Sie die Liste verwenden und die Größe überprüfen?

if (query.list().size() == 1) 

Da Sie kein get() ausführen, um Ihr eindeutiges Objekt zu erhalten, wird eine Abfrage ausgeführt, unabhängig davon, ob Sie uniqueResult oder list aufrufen.

  • Im Moment verwende ich query.list().isEmpty(), um zu sehen, ob Daten zurückgegeben werden … Ich dachte, es wäre einfach für den Programmierer, wenn wir ein Nullobjekt wie die Methode get() erhalten würden. Vielen Dank

    – WowBow

    15. November 2011 um 15:31 Uhr

  • Kein Problem. IsEmpty war offensichtlich das, was ich meinte, als ich meine Antwort schrieb;)

    – Alex Barnes

    15. November 2011 um 15:33 Uhr

  • @Alex: Das einzige Problem bei diesem Ansatz ist, dass Sie eine verwenden müssen zusätzliche Abfrage um die Zählung zu bekommen. Es könnte ein Performance-Overhead sein.

    – ManuPK

    15. November 2011 um 16:17 Uhr

  • Warum benötigen Sie eine zusätzliche Abfrage, um die Anzahl zu erhalten? Sie haben bereits eine Liste mit allen Entitäten, die der Abfrage entsprechen.

    – Alex Barnes

    15. November 2011 um 16:32 Uhr

  • @Alex: Ok. Dann Abfrage.Liste() sind getrennt aufzubewahren und zu kontrollieren. Ich habe verstanden, was Sie sagen, und Sie haben Recht wenn Bedingung.

    – ManuPK

    15. November 2011 um 16:38 Uhr

Benutzer-Avatar
ACV

Wenn Sie nicht wissen, ob es Ergebnisse gibt, verwenden Sie getResultList().

List<User> foundUsers = (List<User>) query.getResultList();
        if (foundUsers == null || foundUsers.isEmpty()) {
            return false;
        }
User foundUser = foundUsers.get(0);

Eine weitere Option ist die Verwendung der Methode uniqueResultOptional(), die Ihnen das Ergebnis Optional liefert:

String hql="from DrawUnusedBalance where unusedBalanceDate= :today";
Query query=em.createQuery(hql);
query.setParameter("today",new LocalDate());

Optional<DrawUnusedBalance> drawUnusedBalance=query.uniqueResultOptional();

Benutzer-Avatar
Michael Beljakow

String hql="from DrawUnusedBalance where unusedBalanceDate= :today";
DrawUnusedBalance drawUnusedBalance = em.unwrap(Session.class)
    .createQuery(hql, DrawUnusedBalance.class)
    .setParameter("today",new LocalDate())
    .uniqueResultOptional()
    .orElseThrow(NotFoundException::new);

1186810cookie-checkjavax.persistence.NoResultException: Keine Entität für Abfrage gefunden

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

Privacy policy