代码之家  ›  专栏  ›  技术社区  ›  James Black

ClassCastException试图将检索到的JPA对象强制转换为具体类

  •  2
  • James Black  · 技术社区  · 16 年前

    我不确定我做错了什么,但我有一个类,其中有一个类,所以当我保存技能类时,用户类也会被创建,所以当我加入时,我想一次拉入所有内容,我会得到一个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在我的测试中实际做的事情:

    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部分。

    Skill类基本上只有一些setter/getter,因此我删除了大部分注释,但外键注释除外:

      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

    1 回复  |  直到 16 年前
        1
  •  2
  •   ChssPly76    16 年前

    你正在选择 二者都 Skill User 以及获取包含这两个元素的对象数组。

    您可以这样对待它,也可以稍微重写一下查询:

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

    协会。

    推荐文章