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=?
문제는 SELECT의 모든 user1 부품이라고 기대합니다.
스킬 클래스에는 기본적으로 일부 세터/getters가 있으므로 대부분의 주석을 제거했지만 외국 키는 다음과 같습니다.
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
협회.
제휴하지 않습니다 StackOverflow