2016-03-21 9 views
1

私はHibernateで初心者で、SetMaxResults()関数を使用していくつかのエラーが発生しています。これは私のMySQLのテーブルデータである::SetMaxResults()がHibernateで動作しない

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

これは、4つの同一記録から1つのレコードを取得する方法です。

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); 
     Person person = (Person)query.list(); 
     if(person == null) 
      return null; 
     return person; 
    } 

は、私は1つのレコードが、例外に従ってレコードのArrayListのを取得していますを得ることを期待します。例外はこの行から来ます Person person = (Person)query.list();その行のソースコードには34という数字があります。これは例外です。

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) 
    ... 
    ... 

私は間違っていますか?おかげ

EDIT

こんにちは、はsetMaxResultsは、(1)の記録から1つの結果を返すこととしませんか?

答えて

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

これは不正なキャストです。リストには要素が1つしかありませんが、魔法のようにリストをPersonにキャストすることはできません。 max resultを設定すると、1要素のリストが返されます。

したがって、あなたが

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

こんにちは、setMaxResults(1)はレコードから1つの結果を返すとは考えていませんか? –

+0

もちろん、エラーが発生する可能性があります。 'Person person =(Person)query.list()。get(0);' –

+0

@EddyFreemanはいです。これは、リストの中にある1つの要素だけを返します。直接の人ではありません:) –

1

より良い使用に

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

しかし、これには注意がをしなければならないユニークなエントリがない場合、それは例外をスローします。

しかし、あなたのケースの使用

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

結果レコードがない場合は、例外のために適切ではありません。 –

+0

もちろん、エラーが発生する可能性があります。 'Person person =(Person)query.list()。get(0);' –

+0

@ v.ladynev未知の順序で一意でないエントリを取得するのは良い方法ではありません。私はトピックスターターが一意の結果を得るために厳格な基準を使うべきだと思う。 – Fr0stDev1

1

はちょうどこのようなあなたのコードを変更し、私はそれが動作することを願っています。ありがとう

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(); 
} 
関連する問題