يحاول ClassCastException إرسال كائن JPA المسترد إلى فئة محددة

StackOverflow https://stackoverflow.com/questions/1934742

سؤال

لست متأكدًا من الخطأ الذي أفعله، ولكن لدي فصل دراسي يحتوي على فصل دراسي بداخله، لذلك عندما أقوم بحفظ فئة المهارة، يتم أيضًا إنشاء فئة المستخدم، لذلك عندما أقوم بالانضمام وأريد سحب كل شيء في مرة واحدة، أحصل على استثناء classcast.

هذه هي الطريقة التي أتصل بها باستعلامي.

val retrieved_obj = em.createNamedQuery("findAllSkillsByUser").setParameter("username", user.username ).getResultList().asInstanceOf[java.util.List[Skill]]
assertEquals(1, retrieved_obj.size())
val retrieved = retrieved_obj.get(0).asInstanceOf[Skill]

هذا هو استفساري:<query><![CDATA[from Skill a JOIN a.user u WHERE u.username=:username]]></query>

هذا ما يفعله السبات فعليًا في الاختبار الخاص بي:

Hibernate: insert into users (firstName, lastName, username, id) values (?, ?, ?, ?)
Hibernate: insert into skills (datestarted, name, position, rating, skill_user_fk, id) values (?, ?, ?, ?, ?, ?)
Hibernate: select skill0_.id as id64_0_, user1_.id as id63_1_, skill0_.datestarted as datestar2_64_0_, skill0_.name as name64_0_, skill0_.position as position64_0_, skill0_.rating as rating64_0_, skill0_.skill_user_fk as skill6_64_0_, user1_.firstName as firstName63_1_, user1_.lastName as lastName63_1_, user1_.username as username63_1_ from skills skill0_ inner join users user1_ on skill0_.skill_user_fk=user1_.id where user1_.username=?

أتوقع أن المشكلة تكمن في جميع أجزاء المستخدم 1 في التحديد.

تحتوي فئة Skill فقط على بعض أدوات الضبط/الحروف، بشكل أساسي، لذلك قمت بإزالة معظم التعليقات التوضيحية باستثناء المفتاح الخارجي:

  var id : Int = _
  var name : String = ""
  var position : Int = _
  var dateStarted : Date = new Date()
  var rating : SkillRating.Value = SkillRating.unknown

  @OneToOne{val fetch = FetchType.EAGER, val cascade=Array(CascadeType.PERSIST, CascadeType.REMOVE)}
  @JoinColumn{val name = "skill_user_fk", val nullable = false}
  var user : User = _

هذه هي فئة المستخدم:

  var id : Int = _
  var firstName : String = ""
  var lastName : String = ""
  var username : String = ""

هذا هو خطأي:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to jblack.resumeapp.lift.model.Skill

لا أفضّل مجرد تحديد سمات المهارة ثم يتعين علي إجراء استعلام آخر للمستخدم، لأن ذلك سيكون أقل كفاءة عندما تصبح فصولي أكثر تعقيدًا.

هل كانت مفيدة؟

المحلول

أنت تقوم بالاختيار كلاهما Skill و User واستعادة مصفوفة كائن تحتوي على كليهما كعناصر.

يمكنك إما التعامل معه على هذا النحو أو إعادة كتابة استعلامك قليلاً:

select a from Skill a JOIN FETCH a.user u WHERE u.username=:username

للاختيار فقط Skill ولكن جلب وملء لها User منظمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top