Question

Je ne suis pas certain de ce que je fais mal, mais j'ai une classe qui a une classe en son sein, alors quand je sauve la classe de compétence de la classe utilisateur est également créé, alors quand je la rejoins et je veux tirer tout en une seule fois, je reçois un ClassCastException.

Voici comment j'appelle ma requête.

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]

est ma requête: <query><![CDATA[from Skill a JOIN a.user u WHERE u.username=:username]]></query>

est ce que veille prolongée est en train de faire dans mon test:

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=?

Je pense que le problème est toutes les parties util_1 dans la sélection.

La classe de compétence a juste quelques setters / getters, au fond, donc je retiré la plupart des annotations, mais la clé étrangère un:

  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 = _

Ceci est la classe utilisateur:

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

Ceci est mon erreur:

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

Je préférerais pas simplement sélectionner les compétences et les attributs doivent faire une autre requête pour l'utilisateur, qui sera moins efficace que mes classes deviennent plus compliquées.

Était-ce utile?

La solution

Vous sélectionnez deux Skill et User et revenir un tableau d'objets contenant à la fois comme éléments.

Vous pouvez traiter soit comme tel ou réécrire votre requête un peu:

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

pour sélectionner uniquement Skill mais chercher et remplir son association User.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top