2016-03-21 18 views
1

Hazırda beklemede ve SetMaxResults() işlevini kullanarak bazı hatalar alıyorum. Bu benim MySQL tablo veri ::SetMaxResults() Hazırda Beklemede değil

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

bu 4 özdeş kayıtlarından bir kayıt almak için yöntem olmasıdır.

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; 
    } 

Ben bir kayıt ama İstisna göre kayıtların bir ArrayList alıyorum almak için bekliyoruz. Özel durum bu satırdan gelir Person person = (Person)query.list(); Bu satırın kaynak kodumda 34 numarası vardır. Bu istisnadır.

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

Neyi yanlış yapıyorum?

Merhaba, setMaxResults (1) kayıtlarından 1 sonuçları döndürmek için varsayalım değil mi teşekkür

DÜZENLEME?

cevap

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

Bu yasadışı bir dökümdür. Listede tek bir öğe olsa da, bir listeyi sihirli olarak Person'a atayamazsınız. Maksimum sonucu ayarladığınızda, hala 1 öğeli bir liste döndürür.

Dolayısıyla,

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

Merhaba, setMaxResults (1), kayıtlardan 1 sonuç döndüreceğini varsayar mı? –

+0

Bu hataya eğilimli, tabii ki 'Kişiler kişi = (Kişi) query.list(). Get (0);' –

+0

@EddyFreeman Evet öyle. Listenin içinde sadece bir elementi döndürüyor. doğrudan bir kişi değil :) –

1

iyi kullanacağım

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

yapmak Fakat bununla dikkatli olmak zorunda eşsiz bir yazı bulunmaktadır değilse o istisna atar.

Ama bu durum

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

Sonuç kayıtları olmadığında, bir istisna nedeniyle uygun değildir. –

+0

Bu hataya eğilimli, elbette ki 'Kişi kişi = (Kişi) query.list(). Get (0); ' –

+0

@ v.ladynev Bu bilinmeyen düzende benzersiz olmayan giriş almak için iyi bir uygulama değil, yani Ben konu başlığında benzersiz sonuç almak için daha sıkı kriterler kullanması gerektiğini düşünüyorum – Fr0stDev1

1

Sadece bu gibi kodunu değiştirmek kullanmak, ben işe umuyoruz. Teşekkürler

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(); 
} 
İlgili konular