2016-03-21 19 views
1

Ich bin ein Neuling in Hibernate und einige Fehler mit der SetMaxResults()-Funktion erhalten. Das sind meine MySQL-Tabellendaten:SetMaxResults() funktioniert nicht im Ruhezustand

1 J. C. Smell 
2 J. C. Smell 
3 J. C. Smell 
4 J. C. Smell 

Dies ist die Methode zum Abrufen eines Datensatzes aus 4 identischen Datensätzen.

Ich erwarte, einen Datensatz zu bekommen, aber nach der Ausnahme bekomme ich eine ArrayList von Datensätzen. Die Ausnahme kommt von dieser Zeile Person person = (Person)query.list(); Diese Zeile hat die Nummer 34 in meinem Quellcode.Dies ist die Ausnahme.

java.lang.ClassCastException: java.util.ArrayList cannot be cast to chapter3.simple.Person 
    at chapter3.simple.RankingTest.findPerson(RankingTest.java:34) 
    at chapter3.simple.RankingTest.savePerson(RankingTest.java:41) 
    at chapter3.simple.RankingTest.testSaveRanking(RankingTest.java:72) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    ... 
    ... 

Was mache ich falsch? Dank

EDIT

Hallo ist die setMaxResults (1) nicht mehr als 1 Ergebnisse annehmen, aus den Aufzeichnungen zurück?

Antwort

3
Person person = (Person)query.list(); 

Das ist eine illegale Besetzung. Obwohl die Liste ein einzelnes Element enthält, können Sie eine Liste nicht magisch auf Person umwandeln. Wenn Sie das maximale Ergebnis festlegen, wird immer noch eine Liste mit 1 Element zurückgegeben.

Daher haben Sie mit diesem

Person person = (Person)query.list().get(0); 
+0

Hallo, ist die setMaxResults (1) nicht angenommen, 1 Ergebnisse aus den Datensätzen zurückzugeben? –

+0

Es ist eine fehleranfällige, natürlich 'Person Person = (Person) query.list(). Get (0);' –

+0

@EddyFreeman Ja ist es. Es gibt nur ein Element zurück, das sich in der Liste befindet. keine direkte Person :) –

1

Bessere Nutzung

Person person = (Person)query.uniqueResult(); 

Aber Vorsicht zu tun, wirft es Ausnahme, wenn es nicht eindeutigen Eintrag ist.

Aber es Ihrem Fall

Person person = (Person)query.list().get(0); 
+1

Es ist nicht geeignet, wegen einer Ausnahme, wenn es keine Ergebnissätze gibt. –

+0

Es ist eine fehleranfällige, natürlich 'Person Person = (Person) query.list(). Get (0);' –

+0

@ v.ladynev Das ist keine gute Praxis, um nicht-eindeutigen Eintrag von unbekannter Reihenfolge zu bekommen, so Ich denke, Thema Starter sollte strengere Kriterien verwenden, um einzigartige Ergebnis – Fr0stDev1

1

einfach Ihren Code verwenden ändern, ich hoffe, es funktioniert. Danke

private Person findPerson(Session session, String name){ 
     Query query = session.createQuery("from Person p where p.name=:name") 
     query.setParameter("name", name) 
     query.setMaxResults(1); 
     return (Person)query.uniqueResult(); 
} 
Verwandte Themen