Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate引发HibernateQueryException:无法解析属性_Java_Hibernate_Spring - Fatal编程技术网

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

Java Hibernate引发HibernateQueryException:无法解析属性,java,hibernate,spring,Java,Hibernate,Spring,所以我有一个表,我在hibernate中将它定义为一个实体,如下所示: @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(

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

@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);
}
当我试图针对该表编写一个简单查询时:

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);
}

为什么hibernate不能找出我的类上的dbgroupid是什么?

可能是因为您将它标记为“dbgroupid”,而不是“dbgroupid”?

我在这方面取得了一些进展,但我仍然不明白hibernate的名字是从哪里来的。我对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 -> 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,如下所示:

@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);
}
public集合getPreferencesForDBGroup(长dbgroupId){
最终DetachedCriteria=DetachedCriteria.forClass(Preference.class)
.add(Restrictions.eq(“DBGroupId”,DBGroupId))
.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
返回getHibernateTemplate().findByCriteria(条件);
}

现在它起作用了

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

public long getDbgroupId() {
    return dbgroupid;
}

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

这是因为我在getXXX方法中声明了它吗?这就是它得到资本化的地方吗?@Ralph-是的,这是不被禁止的。但我把他的域名作为一个起点,因此我建议修改getter。可能是另一种情况。但是你是对的,开头多个大写字母是很棘手的。你是对的-候补小姐是你的答案吗-所以我删除了我的评论。我有一个类似的问题,我使用了全大写字母,没有找到正确的getter:
.add(Restrictions.eq(“DBGROUPID”,DBGROUPID))
与其让IDE生成getter和setter,不如更好地使用