Can not set java.lang.Integer field to java.lang.Integer

25,501

Solution 1

What happens if you change your HQL query to from UserPattern where user.id = :user_id and pattern.id = :pattern_id?

I think Hibernate is confusing objects and ID fields.

Solution 2

You need to modify your query as follows:

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

In your query, you are trying to match a User object with an Integer object.

Solution 3

If your field name is "id", your getter and setter methods should be named

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

If your are using Eclipse, generate the getter/setter by right click -> Source -> Generate Getters and Setters...

Make sure your getters and setter are public. Also you should add @Table-Annotation to all your Entities

Share:
25,501
gstackoverflow
Author by

gstackoverflow

Updated on September 14, 2020

Comments

  • gstackoverflow
    gstackoverflow over 3 years

    User declaration:

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

    Pattern declaration:

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

    UserPatternDeclaration:

    public class UserPattern {
        @Id
        @GeneratedValue
        Integer id;
    
        @ManyToOne
        @JoinColumn(name = "user_id")
        User user;
    
        @ManyToOne
        @JoinColumn(name = "pattern_id")
        Pattern pattern;
        ...
    

    request to database:

    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
    

    I got following exception:

     ...
        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)
        ....
    

    Please help to fix this issue.

    error message looks very very strange.

    I have read related topic click but I don't found out answer.

    P.S.

    hibernate log(before exception):

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

    In browser I see following message:

    HTTP Status 500....could not get a field value by reflection getter of...model.User.id
    
    • Pimgd
      Pimgd almost 10 years
      Do you have getters and setters for that id field?
    • gstackoverflow
      gstackoverflow almost 10 years
      Yes, I have getters and setters for all fields
    • Pimgd
      Pimgd almost 10 years
      What's up with the difference in "patern_id" and "pattern_id"?
    • gstackoverflow
      gstackoverflow almost 10 years
      @Pimgd - fixed, recreate database tables(drope and then create) but I see old result
    • Pimgd
      Pimgd almost 10 years
      What kind of database are you using? Can you retrieve an empty result set without problems using that code? Can you retrieve a User object by doing a from user where id = ? query?
    • gstackoverflow
      gstackoverflow almost 10 years
      1.mysql 2.don't understand what do you want
    • gstackoverflow
      gstackoverflow almost 10 years
      3.**Query query1 = session.createQuery("from User where id= 1"); System.out.println(query1.list());** - this code works good
  • gstackoverflow
    gstackoverflow almost 10 years
    It is enough strange because I know that HQL uses class name instead of table name, and property names instead of column name. UserPattern hasn't user.id property.
  • gstackoverflow
    gstackoverflow almost 10 years
    It is enough strange because I know that HQL uses class name instead of table name, and property names instead of column name. UserPattern hasn't user.id property.
  • Pimgd
    Pimgd almost 10 years
    No but the idea is this: If everything was public... what would you need to call to get to the user's id? UserPattern.user.id! So that's why it's user.id.
  • dieter
    dieter almost 10 years
    Oh. It's true. @Table annotation allows to specify the name of the table and some other details. docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/…