2010-12-14 2 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 I в моем классе?

ответ

14

Возможно, это связано с тем, что ваш геттер (и сеттер) не следует конвенции javabeans. Оно должно быть:

public long getDbgroupId() { 
    return dbgroupid; 
} 

То, что я хотел бы предложить, это - имя поля ваши, а затем использовать IDE для создания сеттеров и добытчиками. Он будет следовать конвенции. (Другое дело, это вопрос предпочтения, но, на мой взгляд, класс легче читать - аннотировать ваши поля, а не геттеры)

+0

@ Ральф - да, это не запрещено. Но я взял имя своего поля в качестве отправной точки, поэтому я предложил изменение геттера. Возможно, это было наоборот. Но вы правы, что несколько заглавных букв в начале сложны. – Bozho

+0

Вы правы - пропустил ваш глупый вопрос - так что я удалил свой комментарий уже – Ralph

+0

У меня была аналогичная проблема, когда я использовал все прописные буквы и не нашел правильный getter: '.add (Restrictions.eq (" DBGROUPID ", dbgroupId)) ' –

2

Возможно, потому, что вы назвали его «DBGroupId», а не «dbgroupid»?

+0

Это потому, что я объявил его методом getXXX? И где он получает капитализацию? –

5

Ну, я сделал некоторый прогресс в этом, но я до сих пор не понимаю, где спящий режим получает свои имена. Я отлажена в кишки спящего режима и нашла следующий класс:

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 -> [email protected] 
key -> [email protected] 
value -> [email protected] 
systemUserId -> [email protected] 
securityRoleId -> [email protected] 
externalGroupId -> [email protected] 
DBGroupId -> [email protected] 

Здесь вы можете увидеть, что капитализация DBGroupId не соответствует тому, что я имел в моих критериях. Поэтому я изменил это с 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); 
} 

Теперь это работает.

Смежные вопросы