【问题标题】:Can not set java.lang.Integer field to java.lang.Integer无法将 java.lang.Integer 字段设置为 java.lang.Integer
【发布时间】:2014-09-01 20:24:18
【问题描述】:

用户声明:

@Entity
public class User {
    @Id
    @GeneratedValue
    private Integer id;
    ....

模式声明:

@Entity
public class Pattern {
    @Id
    @GeneratedValue
    Integer id;
    ...

用户模式声明:

public class UserPattern {
    @Id
    @GeneratedValue
    Integer id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    @ManyToOne
    @JoinColumn(name = "pattern_id")
    Pattern pattern;
    ...

对数据库的请求:

Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from UserPattern where user = :user_id and pattern = :pattern_id ");
query.setParameter("user_id", userId);
query.setParameter("pattern_id", pattern_id);
List<UserPattern> list = query.list();//exception throws here

我遇到了以下异常:

 ...
    java.lang.IllegalArgumentException: Can not set java.lang.Integer field 
    com.....s.model.User.id to java.lang.Integer
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
        at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
        at java.lang.reflect.Field.get(Field.java:379)
    ....

请帮助解决此问题。

错误信息看起来非常非常奇怪。

我已经阅读了相关主题click,但我没有找到答案。

附言

休眠日志(异常前):

Hibernate: 
    select
        userpatter0_.id as id1_2_,
        userpatter0_.amountSearched as amountSe2_2_,
        userpatter0_.amountplayed as amountpl3_2_,
        userpatter0_.pattern_id as pattern_4_2_,
        userpatter0_.user_id as user_id5_2_ 
    from
        UserPattern userpatter0_ 
    where
        userpatter0_.user_id=? 
        and userpatter0_.pattern_id=?

在浏览器中我看到以下消息:

HTTP Status 500....could not get a field value by reflection getter of...model.User.id

【问题讨论】:

  • 你有那个 id 字段的 getter 和 setter 吗?
  • 是的,我有所有领域的getter和setter
  • “pattern_id”和“pattern_id”的区别是什么?
  • @Pimgd - 已修复,重新创建数据库表(drope 然后创建)但我看到旧结果
  • 您使用的是什么类型的数据库?您可以使用该代码毫无问题地检索空结果集吗?您可以通过 from user where id = 来检索 User 对象吗?查询?

标签: java hibernate persistence hql


【解决方案1】:

我想也许你的注释应该是

@ManyToOne(TargetEntity=..class)

【讨论】:

    【解决方案2】:

    如果你的字段名是“id”,你的getter和setter方法应该被命名

    public Integer getId(){return id;}
    public void setId(Integer id){this.id = id};
    

    如果您使用的是 Eclipse,请通过右键单击 -> 源 -> 生成 Getter 和 Setter...

    生成 getter/setter

    确保您的 getter 和 setter 是公开的。您还应该为所有实体添加 @Table-Annotation

    【讨论】:

    【解决方案3】:

    您需要按如下方式修改您的查询:

    from UserPattern where user.id = :user_id and pattern.id = :pattern_id
    

    在您的查询中,您尝试将User 对象与Integer 对象匹配。

    【讨论】:

    • 这很奇怪,因为我知道 HQL 使用类名而不是表名,使用属性名而不是列名。 UserPattern 没有 user.id 属性。
    【解决方案4】:

    如果您将 HQL 查询更改为 from UserPattern where user.id = :user_id and pattern.id = :pattern_id,会发生什么情况?

    我认为 Hibernate 混淆了对象和 ID 字段。

    【讨论】:

    • 这很奇怪,因为我知道 HQL 使用类名而不是表名,使用属性名而不是列名。 UserPattern 没有 user.id 属性。
    • 不,但想法是这样的:如果一切都是公开的......你需要调用什么来获取用户的 ID? UserPattern.user.id!这就是为什么它是 user.id。
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2015-12-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多