Pergunta

Não tenho certeza do que estou fazendo de errado, mas tenho uma aula que tem uma aula nela; portanto, quando eu salvo a classe de habilidade, a classe de usuário também é criada, então, quando eu faço a junção e quero atrair tudo em Uma vez, recebo uma classe de classe.

É assim que estou chamando minha 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 é minha consulta:<query><![CDATA[from Skill a JOIN a.user u WHERE u.username=:username]]></query>

É isso que o Hibernate está realmente fazendo no meu teste:

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 o problema seja todas as peças do usuário1 na seleção.

A aula de habilidade apenas tem alguns setters/getters, basicamente, então eu removi a maioria das anotações, mas a chave estrangeira:

  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 é a classe de usuário:

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

Este é o meu erro:

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

Prefiro não apenas selecionar os atributos de habilidade e, em seguida, ter que fazer outra consulta para o usuário, pois isso será menos eficiente à medida que minhas classes ficam mais complicadas.

Foi útil?

Solução

Você está selecionando Ambas Skill e User e recuperar uma matriz de objetos contendo ambos como elementos.

Você pode tratá -lo como tal ou reescrever um pouco sua consulta:

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

para selecionar apenas Skill Mas buscar e preencher seu User Associação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top