2013-04-08 50 views
0

我有以下幾點:休眠忽略屬性名的情況下

@Entity 
public class Person { 

    @Id 
    private long id; 

    @Column 
    private String firstName; 

    // getters and setters 
} 

我想以下工作:

Criteria criteria = session.createCriteria(Person.class); 

criteria.add(Restrictions.eq("firstName", "john")); 

OR  

criteria.add(Restrictions.eq("FIRSTNAME", "john")); 

OR 

criteria.add(Restrictions.eq("fiRstName", "john")); 

基本上,我有一個Web服務,它允許在後端對象的篩選,我們正在試圖忽略的屬性的名稱的情況。我不知道如何做到這一點。我搜索看着休眠文檔和Hibernate的來源,但一無所獲。從休眠唯一的例外是

org.hibernate.QueryException: could not resolve property FIRSTNAME (or fiRstName) of com.abc.Person 
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81) 
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1482) 
    at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:62) 
    at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1457) 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:483) 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.findColumns(CriteriaQueryTranslator.java:498) 
    at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:68) 

回答

0
  • 您可以嘗試生成MetaModel類的實體。

    criteria.add(Restrictions.eq(Person_.firstName, "john"));

  • 否則,在一般情況下,你可以嘗試使用反射在獲取類聲明的字段。

    Field[] fields = Person.class.getDeclaredFields();  
    
    for(int i = 0; i < fields.length; i++){ 
    
        if(fields[i].getName().equalsIgnoreCase("FIRSTNAME")){ 
    
          criteria.add(Restrictions.eq(fields[i].getName(), "john"));  
    
          break; 
        } 
        } 
    
+0

,我不認爲這種元模型方法將爲我們的情況下工作。反射部分可能是一個更好的解決方案,我們可以在啓動時將所有字段的緩存在內存中,避免做在每次調用反射。我沒有想過這個。我將圍繞浮一下,看看別人怎麼想。 唯一的問題,這真的不應該是一個問題,是不同的情況下,在同一個實體或實體層次結構中的同名字段: 的firstName VS名字。 – CAL5101 2013-04-09 17:00:00