ClassCastException пытается преобразовать полученный объект JPA в конкретный класс
-
20-09-2019 - |
Вопрос
Я не уверен, что делаю неправильно, но у меня есть класс, в котором есть класс, поэтому, когда я сохраняю класс Skill, пользовательский класс также создается, поэтому, когда я выполняю соединение, я хочу получить все в однажды я получаю исключение 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=?
Я ожидаю, что проблема во всех частях user1 в выборе.
В классе 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
ассоциация.