Hibernate wirft HibernateQueryException: could not resolve property
Also ich habe eine Tabelle, die ich definiert habe als entity in hibernate wie diese:
@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;
}
}
Wenn ich zu schreiben versucht, eine einfache Abfrage für diese Tabelle:
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);
}
Bekam ich die folgende Fehlermeldung:
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
Warum nicht hibernate herauszufinden, was dbgroupid ist meine Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wahrscheinlich, weil Ihre getter (und setter) wird nicht nach der javabeans-Konvention. Es sollte sein:
Was ich vorschlagen würde ist - benennen Sie Ihre Felder, und dann nutzen Sie Ihre IDE zu generieren setter und Getter. Es Folgen die Konvention. (Eine andere Sache, das ist eine Sache der Vorliebe, aber meiner Meinung nach macht eine Klasse leichter zu Lesen - kommentieren Sie Ihre Felder nicht Getter)
.add(Restrictions.eq("DBGROUPID", dbgroupId))
Gut ich machte einige Fortschritte, aber ich verstehe immer noch nicht, wo hibernate bekommt seinen Namen. Ich gedebuggt in die Grundlagen von hibernate und fanden die folgende Klasse:
In dieser Klasse gibt es eine Methode:
Welche versucht, den Namen aufzulösen, in die Kriterien, die gegen das Objekt. So in der typesByPropertyPath Karte fand ich folgende Werte:
Hier kannst du sehen, dass die groß-und Kleinschreibung DBGroupId nicht mit dem übereinstimmen, was ich hatte, in meine Kriterien. Also habe ich das geändert, aus dbgroupid zu DBGroupId wie diese:
Jetzt funktioniert es.
Vielleicht, weil Sie haben beschriftet es "DBGroupId", und nicht "dbgroupid"?