2010-12-14 11 views
8

Così ho una tabella che ho definito come un'entità in Hibernate in questo modo:Hibernate getta HibernateQueryException: impossibile risolvere proprietà

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

} 

Quando ho provato a scrivere un semplice query su questa tabella:

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

ho ottenuto il seguente errore:

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 

Perché non è possibile ibernare capire cosa dbgroupid i s sulla mia classe?

risposta

14

Probabilmente è perché il vostro getter (e setter) non sta seguendo la convenzione javabeans. Dovrebbe essere:

public long getDbgroupId() { 
    return dbgroupid; 
} 

Quello che suggerirei è - assegnare un nome al campo, e quindi utilizzare il vostro IDE per generare setter e getter. Seguirà la convenzione. (Un'altra cosa, è una questione di preferenza, ma a mio avviso rende una lezione più facile da leggere - annota i tuoi campi, non getter)

+0

@ Ralph - sì, non è proibito. Ma ho preso il suo nome di campo come punto di partenza, quindi ho suggerito un cambiamento getter. Potrebbe essere stato il contrario. Ma hai ragione che le lettere maiuscole all'inizio sono difficili. – Bozho

+0

Hai ragione - mi manca capire il tuo anser - quindi rimuovo il mio commento già – Ralph

+0

Ho avuto un problema simile in cui stavo usando tutto maiuscolo e non trovavo il getter giusto: '.add (Restrictions.eq (" DBGROUPID ", dbgroupId)) ' –

2

Forse perché lo hai etichettato "DBGroupId", e non "dbgroupid"?

+0

È perché ho dichiarato sul metodo getXXX? Ed è qui che ottiene la maiuscola? –

5

Bene, ho fatto qualche progresso su questo, ma continuo a non capire dove il letargo prende il nome. Ho il debug nelle viscere di Hibernate e ho trovato la seguente classe:

org.hibernate.persister.entity.AbstractPropertyMapping 

In questa classe c'è un metodo:

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

che cerca di risolvere il nome dato nei criteri contro l'oggetto. Così nella mappa typesByPropertyPath ho trovato i seguenti valori:

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

Qui potete vedere che la capitalizzazione di DBGroupId non corrisponde con quello che avevo nei miei criteri. Quindi l'ho modificato da dbgroupid a DBGroupId in questo modo:

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

Ora funziona.

Problemi correlati