2010-12-14 10 views
8

だから、私はこのように休止状態にエンティティとして定義したテーブルを持っている:Hibernateは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

おそらく、あなたのゲッター(およびセッター)がjavabeansの規約に従わないためです。それは次のようになります。

public long getDbgroupId() { 
    return dbgroupid; 
} 

私がお勧めしたいどのようなものです - あなたのフィールドに名前を付け、その後、セッターとゲッターを生成するためにあなたのIDEを使用しています。それは条約に従うでしょう。 (別のことは、好みの問題ですが、私の考えでは、クラスを読みやすくする - ゲッターではなくフィールドに注釈を付ける)

+0

@Ralph - はい、禁止されていません。しかし、私は彼のフィールド名を出発点として取ったので、ゲッターの変更を提案しました。それは逆のことかもしれない。しかし、最初の複数の大文字は厄介であるというのは正しいことです。 – Bozho

+0

あなたは正解です - 私のコメントは既に削除されています – Ralph

+0

私はすべて大文字を使用していて、正しいゲッターを見つけられなかった同様の問題がありました:.add(Restricions.eq( "DBGROUPID"、dbgroupId )) ' –

2

「dbgroupid」ではなく「DBGroupId」というラベルが付けられている可能性がありますか?

+0

これはgetXXXメソッドで宣言しているからですか?それが資本金を得る場所ですか? –

5

私はこれについていくつかの進歩を遂げましたが、私はまだ休止状態がその名前を得る場所を理解していません。私は、Hibernateの根性にデバッグして、次のクラスが見つかりました:オブジェクトに対する基準で指定された名前を解決しようと

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

:メソッドがあり、このクラスでは

org.hibernate.persister.entity.AbstractPropertyMapping 

を。ここで

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

あなたがDBGroupIdの総額が、私は私の基準で持っていたものと一致しなかったことを見ることができます。typesByPropertyPathマップ内だから私は、次の値を見つけました。そこで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); 
} 

これで動作します。

関連する問題