Pregunta

No estoy seguro de lo que estoy haciendo mal, pero tengo una clase que tiene una clase dentro de ella, por lo que al guardar la clase Habilidad la clase de usuario también se crea, por lo que cuando me la unión y quiero tirar todo en una sola vez, aparece un ClassCastException.

Esta es la forma en que estoy llamando a mi consulta.

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]

Esta es mi consulta: <query><![CDATA[from Skill a JOIN a.user u WHERE u.username=:username]]></query>

Esto es lo que está haciendo en realidad hibernación en mi prueba:

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

espero que el problema es todas las partes usuario1 en el selecto.

La clase Habilidad simplemente tiene algunas setters / captadores, básicamente, lo que elimina la mayor parte de las anotaciones pero la clave externa uno:

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

Esta es la clase de usuario:

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

Esta es mi error:

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

Yo preferiría no sólo tiene que seleccionar la Habilidad atributos y luego tienen que hacer otra consulta para el usuario, ya que habrá menos eficiente como mis clases se ponen más complicadas.

¿Fue útil?

Solución

Usted está seleccionando ambos Skill y User y volver a una matriz de objetos que contiene tanto como elementos.

Usted puede tratar como tal o reescribir su consulta un poco:

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

para seleccionar sólo Skill pero traer y poblar su asociación User.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top