【问题标题】:Hibernate ignore case in property nameHibernate 忽略属性名称中的大小写
【发布时间】:2013-04-08 16:10:28
【问题描述】:

我有以下几点:

@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)

【问题讨论】:

    标签: hibernate hibernate-criteria


    【解决方案1】:
    • 您可以尝试为实体生成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;
          }
        }
      

    【讨论】:

    • 我认为 MetaModel 方法不适用于我们的案例。反射部分可能是一个更好的解决方案,我们可以在启动时将所有字段的缓存保存在内存中,以避免在每次调用时都进行反射。我没有想过这个。我会把它飘来飘去,看看别人怎么想。唯一不应该成为问题的问题是同一实体或实体层次结构中具有不同大小写的相同名称的字段:firstName vs firstname。
    猜你喜欢
    • 2011-11-30
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多