带有createSQLQuery的ResultTransformer强制实体字段中没有camelCase

时间:2011-11-15 12:19:00

标签: hibernate postgresql

我有一个SQL查询,如下所示:

List<Employee> employees = getCurrentSession()
                    .createSQLQuery(
                            "select"
                                    + e.id as id,e.first_name as firstName,e.password as password
                                    + "from employee e,employee_role er,role r where e.employee_id=er.employee_id and er.role_id=r.role_id and r.name='ROLE_ADMIN' ")
                    .setResultTransformer(Transformers.aliasToBean(Employee.class))
                    .list();

我在Employee中有一个名为firstName的属性,但是当在单元测试中尝试在dao上运行时,我得到以下异常:

org.hibernate.PropertyNotFoundException: Could not find setter for firstname on class com.app.domain.Employee

我不知道hibernate从这个firstname属性中得到了什么?我在查询中没有说出来吗?

解决方法的任何方式是将属性更改为firstname,以及getter,setter 但任何想法为什么hibernate正在制作这样的行为,以及如何避免它,因为我想在我的域中使用camelCase,请指教。

3 个答案:

答案 0 :(得分:23)

您可以使用addScalar(String columnAlias, Type type)显式声明本机SQL的列别名:

  getCurrentSession()
  .createSQLQuery( "select e.id as id,e.first_name as firstName,e.password as password from xxxxxx")
                .addScalar("id",StandardBasicTypes.INTEGER )
                .addScalar("firstName",StandardBasicTypes.STRING )
                .addScalar("password",StandardBasicTypes.STRING )
                .setResultTransformer(Transformers.aliasToBean(Employee.class))
                .list();

答案 1 :(得分:17)

对于更简单的解决方案,请将查询中的标识符双引号发送到服务器。而不是

e.first_name as firstName

应该阅读

e.first_name as "firstName"

在PostgreSQL中,双引号标识符会强制区分大小写。不带引号,它(大部分)遵循SQL标准并折叠为单个案例(尽管标准是大写的小写)。

答案 2 :(得分:0)

可能与您配置NamingStrategy

的方式有关

http://matthew.mceachen.us/blog/hibernate-naming-strategies-20.html

如果你正在使用MySQL,你是否已启用区分大小写的表/列名称http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html