14

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
7
  • 1
    Do you have getters and setters for that id field? Commented Jul 11, 2014 at 9:00
  • Yes, I have getters and setters for all fields Commented Jul 11, 2014 at 9:05
  • What's up with the difference in "patern_id" and "pattern_id"? Commented Jul 11, 2014 at 9:06
  • @Pimgd - fixed, recreate database tables(drope and then create) but I see old result Commented Jul 11, 2014 at 9:11
  • 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? Commented Jul 11, 2014 at 9:16

5 Answers 5

15

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.

Sign up to request clarification or add additional context in comments.

2 Comments

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

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.

1 Comment

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

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

1 Comment

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/…
0

i think maybe your annotation should be

@ManyToOne(TargetEntity=....class)

Comments

0

I struggled with this for days and have finally found the answer.
You used to be able to tell Hibernate what type the parameter was by using alternatives to setParameter() such as setInteger etc. But these are now deprecated.

The problem is Hibernate is failing to interpret the type correctly for some reason. But there is an overloaded version of setParameter which allows you to set the type directly.

Firstly import the types:

import org.hibernate.type.StandardBasicTypes;

Then use the following syntax to set the Parameter:

q.setParameter("name", variable containing the value, StandardBasicTypes.INTEGER);

So in your case this would look like:

q.setParameter("user_id", userid, StandardBasicTypes.INTEGER);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.