ResultTransformer с createSQLQuery не создает никаких полей camelCase в сущности
У меня есть запрос 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 в unit test я получаю следующее исключение:
org.hibernate.PropertyNotFoundException: Could not find setter for firstname on class com.app.domain.Employee
Я не знаю, где hibernate получить от этого свойства firstname? Я не сделал этого в своем запросе?
каким-либо образом обходной путь состоял в том, чтобы изменить свойство на firstname, и getters, seters too
но любые идеи, почему спящий режим делает такое поведение и как его избежать, поскольку я хочу использовать camelCase в своем домене, пожалуйста, сообщите нам.
Ответы
Ответ 1
Вы можете использовать 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();
Ответ 2
Для более простого решения дважды укажите идентификатор в запросе, отправленный на сервер. Вместо
e.first_name as firstName
он должен читать
e.first_name as "firstName"
В PostgreSQL двойное цитирование идентификатора приводит к чувствительности к регистру. Unquoted, он (в основном) следует стандарту SQL и сворачивается в один случай (хотя в нижнем регистре, где стандарт является верхним регистром).
Ответ 3
Это может быть связано с тем, как (и если) вы настроили свой 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