2011-05-23 36 views
5

查詢時「無法解析屬性」我有這樣的定義在冬眠一對多關係:休眠例外做的標準和限制

@Entity 
@Table(name = "groups") 
public class Group extends BaseModel {// BaseModel defines id as @Id and @GeneratedValue 

    @OneToMany 
    @JoinColumn(name = "group_id") 
    private List<User> users; 

    // other fields, getters and setters omitted 
} 


@Entity 
@Table(name = "users") 
public class User extends BaseModel { 

    @ManyToOne 
    @JoinColumn(name = "group_id") 
    private Group group; 

    // other fields, getters and setters omitted 
} 

group_id是在用戶表。
調用方法Group.getUsers()User.getGroup()工作正常。但我也需要列group_id後做一個查詢:

Criteria criteria = Activator.getDefault().getSQLSession().createCriteria(User.class); 
Criterion c = Restrictions.eq("group_id", 1); // an id of a group 
criteria.add(c); 

Criterion對象中的方法創建的,也可以是其他一個一對多表或可以包含其他列,所以我不能使用方法getUsers()

可惜的是,上面的代碼提供了以下異常:

org.hibernate.QueryException: could not resolve property: group_id of: com.example.User 
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81) 
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1482) 
    at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:62) 
    and so on ... 

可能是什麼問題呢?


編輯:

的變化是user759837建議(Criterion c = Restrictions.eq("group", 1);)後,當我打電話criteria.list(),我收到此錯誤信息:could not get a field value by reflection getter of com.example.Group.id

java.lang.IllegalArgumentException: Can not set java.lang.Long field com.example.BaseModel.id to java.lang.Long 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) 
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source) 
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source) 
    at java.lang.reflect.Field.get(Unknown Source) 
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:227) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3875) 
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3583) 
    at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:203) 
    at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:242) 
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456) 
    at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:130) 
    ... 

的BaseModel類

@MappedSuperclass 
public abstract class BaseModel { 

    @Id 
    @GeneratedValue 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
} 

我也試過long id,但它是一樣的錯誤。


編輯2:

大量挖掘後,看起來該Criterion對象應該接收組對象作爲參數,而不是一個ID:Restrictions.eq("group", {A_GROUP_OBJECT});

難道是可能的我發送了一個ID?

回答

4

這似乎工作:

Criterion c = Restrictions.eq("group.id", 1); // an id of a group 
+1

+1它也幫助了我,但它爲什麼會這樣呢?我是一個hibernate新手,查看文檔給我的印象是,學習所有的魔法需要花費數年的時間。 – Rajish 2011-08-16 13:43:53

+0

我不知道爲什麼,但它有助於=) – hilbert 2013-01-15 08:43:32

4

你列GROUP_ID,你應該使用哪一個是 ... 標準屬性C = Restrictions.eq( 「」,1); //組的一個ID ...

+0

Oohh!我花了幾個小時嘗試所有組合...... – 2011-05-23 21:48:15

2

如果您使用的是oracle作爲數據庫,原因可能是group_id是其中的關鍵字。將名稱更改爲其他名稱並嘗試使用。

+0

不,它不是oracle,真正的列名甚至不是'group_id'。我改變了它,所以它更清晰。 – 2011-05-24 06:24:06