2010-12-14 81 views
8

所以我有,我已经在休眠定义为一个实体,像这样的表:休眠抛出HibernateQueryException:无法解析属性

@Entity 
@Table(name = "sec_Preference") 
public class Preference { 
private long id; 

@Column(name = "PreferenceId", nullable = false, insertable = true, updatable = true, length = 19, precision = 0) 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Id 
public long getId() { 
    return id; 
} 

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

private long systemuserid; 

@Column(name = "SystemUserId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getSystemUserId() { 
    return systemuserid; 
} 

public void setSystemUserId(long systemuserid) { 
    this.systemuserid = systemuserid; 
} 

private long dbgroupid; 

@Column(name = "DBGroupId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getDBGroupId() { 
    return dbgroupid; 
} 

public void setDBGroupId(long dbgroupid) { 
    this.dbgroupid = dbgroupid; 
} 

private long externalgroupid; 

@Column(name = "ExternalGroupId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getExternalGroupId() { 
    return externalgroupid; 
} 

public void setExternalGroupId(long externalgroupid) { 
    this.externalgroupid = externalgroupid; 
} 

private long securityroleid; 

@Column(name = "SecurityRoleId", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
@Basic 
public long getSecurityRoleId() { 
    return securityroleid; 
} 

public void setSecurityRoleId(long securityroleid) { 
    this.securityroleid = securityroleid; 
} 

public void setEnum(com.vitalimages.common.server.security.Preference pref) { 
    this.preferencekey = pref.name(); 
} 

private String preferencekey; 

@Column(name = "PreferenceKey", nullable = false, insertable = true, updatable = true, length = 255, precision = 0) 
@Basic 
public String getKey() { 
    return preferencekey; 
} 

public void setKey(String key) { 
    this.preferencekey = key; 
} 

private String preferencevalue; 

@Column(name = "PreferenceValue", nullable = true, insertable = true, updatable = true, length = 255, precision = 0) 
@Basic 
public String getValue() { 
    return preferencevalue; 
} 

public void setValue(String value) { 
    this.preferencevalue = value; 
} 

} 

当我试着写对这个表的简单查询:

public Collection<Preference> getPreferencesForDBGroup(long dbgroupId) { 
    final DetachedCriteria criteria = DetachedCriteria.forClass(Preference.class) 
      .add(Restrictions.eq("dbgroupid", dbgroupId)) 
      .setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

    return getHibernateTemplate().findByCriteria(criteria); 
} 

我得到了以下错误:

org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property: dbgroupid of: com.common.server.domain.sec.Preference; nested exception is org.hibernate.QueryException: could not resolve property: dbgroupid of: com.common.server.domain.sec.Preference 

为什么不能冬眠弄清楚什么dbgroupid我对我的班级?

回答

14

这可能是因为你的getter(和setter)没有遵循javabeans约定。它应该是:

public long getDbgroupId() { 
    return dbgroupid; 
} 

我建议的是 - 命名您的字段,然后使用您的IDE来生成setters和getters。它将遵循公约。 (另一件事,这是一个偏好的问题,但在我看来,让一个班更容易阅读 - 注释你的领域,而不是获取者)

+0

@拉尔夫 - 是的,这是不被禁止的。但我把他的领域名称作为起点,因此我提出了一个吸气者的改变。它可能是相反的。但你说得对,开头的多个大写字母很棘手。 – Bozho 2010-12-14 17:19:00

+0

你是对的 - 是小姐understud你的anser - 所以我删除我的评论已经 – Ralph 2010-12-14 17:21:04

+0

我有一个类似的问题,我使用全部大写,并没有找到正确的getter:'.add(Restrictions.eq(“DBGROUPID”,dbgroupId ))' – 2012-07-23 21:19:20

2

也许是因为您已将它标记为“DBGroupId”,而不是“dbgroupid”?

+0

是因为我有它在getXXX方法声明?那就是它获得资本的地方? – 2010-12-14 17:03:27

5

那么我在这方面取得了一些进展,但我仍然不明白hibernate的名字在哪里。我调试进入休眠的胆量,发现以下类:

org.hibernate.persister.entity.AbstractPropertyMapping 

在这个类中有一个方法:

public Type toType(String propertyName) throws QueryException { 
    Type type = (Type) typesByPropertyPath.get(propertyName); 
    if (type == null) { 
     throw propertyException(propertyName); 
    } 
    return type; 
} 

它试图解决对对象的标准中给出的名称。所以在typesByPropertyPath地图,我发现以下值:

id -> [email protected] 
key -> [email protected] 
value -> [email protected] 
systemUserId -> [email protected] 
securityRoleId -> [email protected] 
externalGroupId -> [email protected] 
DBGroupId -> [email protected] 

在这里你可以看到,DBGroupId的大小写不匹配什么我在我的标准。所以我改变了从dbgroupid到DBGroupId这样:

public Collection<Preference> getPreferencesForDBGroup(long dbgroupId) { 
    final DetachedCriteria criteria = DetachedCriteria.forClass(Preference.class) 
      .add(Restrictions.eq("DBGroupId", dbgroupId)) 
      .setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

    return getHibernateTemplate().findByCriteria(criteria); 
} 

现在它的工作。