首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate引发HibernateQueryException:无法解析属性

Hibernate引发HibernateQueryException:无法解析属性
EN

Stack Overflow用户
提问于 2010-12-15 00:57:37
回答 3查看 50.8K关注 0票数 10

所以我有一个在hibernate中定义为实体的表,如下所示:

代码语言:javascript
运行
复制
@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;
}

}

当我试图对这个表编写一个简单的查询时:

代码语言:javascript
运行
复制
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);
}

我得到了以下错误:

代码语言:javascript
运行
复制
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

为什么hibernate不能弄清楚我的类上的dbgroupid是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-15 01:03:01

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

代码语言:javascript
运行
复制
public long getDbgroupId() {
    return dbgroupid;
}

我的建议是-命名您的字段,然后使用IDE生成setter和getter。它将遵循惯例。(另一件事,这是一个偏好问题,但在我看来,让类更容易阅读-注释你的字段,而不是getter)

票数 16
EN

Stack Overflow用户

发布于 2010-12-15 01:02:36

我在这方面取得了一些进展,但我仍然不明白hibernate的名字是从哪里来的。我对hibernate内部进行了调试,发现了以下类:

代码语言:javascript
运行
复制
org.hibernate.persister.entity.AbstractPropertyMapping

在这个类中有一个方法:

代码语言:javascript
运行
复制
public Type toType(String propertyName) throws QueryException {
    Type type = (Type) typesByPropertyPath.get(propertyName);
    if (type == null) {
        throw propertyException(propertyName);
    }
    return type;
}

它尝试根据对象解析标准中给出的名称。因此,在typesByPropertyPath映射中,我发现了以下值:

代码语言:javascript
运行
复制
id -> DBGroupId=org.hibernate.type.LongType@1e96ffd
key -> value=org.hibernate.type.StringType@aa2ee4
value -> value=org.hibernate.type.StringType@aa2ee4
systemUserId -> DBGroupId=org.hibernate.type.LongType@1e96ffd
securityRoleId -> DBGroupId=org.hibernate.type.LongType@1e96ffd
externalGroupId -> DBGroupId=org.hibernate.type.LongType@1e96ffd
DBGroupId -> DBGroupId=org.hibernate.type.LongType@1e96ffd

在这里,您可以看到DBGroupId的大小写与我的标准中的大小写不匹配。所以我把它从dbgroupid改为DBGroupId,如下所示:

代码语言:javascript
运行
复制
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);
}

现在它起作用了。

票数 6
EN

Stack Overflow用户

发布于 2010-12-15 01:00:47

也许是因为您给它贴上了"DBGroupId“的标签,而不是"dbgroupid"?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4441837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档