J'ai une requête SQL comme suit:
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();
J'ai une propriété dans l'employé appelée prenom, mais lorsque j'essaie de courir au-dessus de dao dans un test unitaire, j'obtiens l'exception suivante:
org.hibernate.PropertyNotFoundException: Could not find setter for firstname on class com.app.domain.Employee
Je ne sais pas où hibernate obtenir de cette propriété de prénom? Je n'ai pas le droit dans ma requête?
la solution de contournement consistait à changer la propriété en prénom, ainsi que les accesseurs, mais aussi toute idée pourquoi hibernate crée un tel comportement et comment l'éviter, car je souhaite utiliser camelCase dans mon domaine, veuillez conseiller.
Vous pouvez utiliser addScalar (String columnAlias, Type type) pour déclarer explicitement l'alias de colonne de votre code SQL natif:
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();
Pour une solution plus simple, double-citer l'identifiant dans la requête tel qu'il a été envoyé au serveur. Au lieu de
e.first_name as firstName
il faut lire
e.first_name as "firstName"
Dans PostgreSQL, la double cotation d'un identifiant force la sensibilité à la casse. Non cité, il suit (généralement) le standard SQL et se plie en un seul cas (bien que minuscule lorsque le standard est en majuscule).
Cela peut être lié à la façon (et si) vous avez configuré votre NamingStrategy
http://matthew.mceachen.us/blog/hibernate-naming-strategies-20.html
ou
si vous utilisez MySQL pour tenir le temps ou pas, vous avez activé les noms de table/colonne sensibles à la casse http://dev.mysql.com/doc/refman/5.0/fr/identifier-case-sensitivity.html