ClassCastExceptionが具体的なクラスに取得したJPAオブジェクトをキャストしよう
-
20-09-2019 - |
質問
私はスキルクラスを保存するときにユーザークラスも作成されますので、私は参加しないと私は引くしたいとき、私は私が間違っているの何確かではないが、私はその中にクラスを持つクラスを持っています一度にすべて、私はClassCastExceptionが取得します。
これは私が私のクエリを呼び出しています方法です。
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=?
私はこの問題は、選択中のすべてのuser1の部品で期待しています。
スキルクラスは、単に基本的には、いくつかのセッター/ゲッターを持っているので、私は、注釈のほとんどを取り除くが、1つの外部キーます:
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 = _
これは、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
の関連をフェッチし、移入する。