2010-12-14 21 views
8

Así que tengo una tabla que he definido como una entidad en hibernación como esto:Hibernate lanza HibernateQueryException: no se pudo resolver la propiedad

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

} 

Cuando trataba de escribir una consulta simple en contra de esta tabla:

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

me dieron el siguiente error:

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 

¿Por qué no se puede hibernar averiguar lo que dbgroupid s en mi clase?

Respuesta

14

Probablemente es porque su getter (y setter) no está siguiendo la convención javabeans. Debería ser:

public long getDbgroupId() { 
    return dbgroupid; 
} 

Lo que me gustaría sugerir es - por nombrar sus campos, y luego usar el IDE para generar setters y getters. Seguirá la convención. (Otra cosa, eso es una cuestión de preferencia, pero en mi opinión hace que una clase sea más fácil de leer - anote sus campos, no los getters)

+0

@Ralph: sí, no está prohibido. Pero tomé su nombre de campo como punto de partida, por lo tanto, sugerí un cambio de getter. Podría haber sido al revés. Pero tienes razón en que las letras mayúsculas al principio son complicadas. – Bozho

+0

Tiene usted razón - es la señorita investigar su anser - así que elimino mi comentario ya – Ralph

+0

Tuve un problema similar cuando estaba usando mayúsculas y no encontraba el getter correcto: '.add (Restrictions.eq (" DBGROUPID ", dbgroupId)) ' –

2

Tal vez porque lo ha etiquetado como "DBGroupId" y no como "dbgroupid"?

+0

¿Eso es porque lo tengo declarado en el método getXXX? Y ahí es donde obtiene la capitalización? –

5

Bueno, hice algunos progresos en esto, pero todavía no entiendo dónde se llama hibernate. Me depurado en las tripas de hibernación y encontré la clase siguiente:

org.hibernate.persister.entity.AbstractPropertyMapping 

En esta clase hay un método:

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

que trata de resolver el nombre dado en los criterios contra el objeto. Así que en el mapa typesByPropertyPath me encontré con los siguientes valores:

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

Aquí se puede ver que la capitalización de DBGroupId no encontró lo que tenía en mi criterio. Así que cambié eso de dbgroupid a DBGroupId así:

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

Ahora funciona.

Cuestiones relacionadas