ResultTransformer с createSQLQuery не заставляет camelCase в полях сущностей - PullRequest
17 голосов
/ 15 ноября 2011

У меня есть 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 получить от этого имени свойства? Я не права в своем запросе?

В любом случае, обходной путь должен был изменить свойство на имя, и геттеры, и сеттеры тоже но любые идеи, почему hibernate делает такое поведение, и как этого избежать, так как я хочу использовать camelCase в моем домене, пожалуйста, сообщите.

Ответы [ 3 ]

23 голосов
/ 15 ноября 2011

Вы можете использовать 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();
17 голосов
/ 15 ноября 2011

Для более простого решения дважды заключите в кавычки идентификатор в запросе, отправленный на сервер.Вместо

e.first_name as firstName

следует читать

e.first_name as "firstName"

В PostgreSQL двойные кавычки идентификатора приводят к чувствительности к регистру.Без кавычек он (в основном) следует стандарту SQL и сворачивается в один регистр (хотя и в нижнем регистре, где стандартом является верхний регистр).

0 голосов
/ 15 ноября 2011

Это может быть связано с тем, как (и если) вы настроили 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...