在使用Spring的HibernateTemplate查找数据时,出现题目中的错误信息,从字面可以看出是HQL语句的参数设置出了问题.
原因:JPA的问号索引是从1开始的,而HibernateTemplate是从0开始的。而且HibernateTemplate执行HQL语句时,HQL的语句中'?'号面是不带数字的,而使用JPA时,HQL语句的'?'是可以有数字的(是否必须有待考证),带数字的话一定是从1开始。
对于使用HibernateTemplate而言:
(1)正确:'from User where username = ? and password = ?'
(2)错误:'from User where username = ?1 and password = ?2'
设置参数:
/**
* 为Where语句传递参数
* @param query
* @param queryParams
* o.key = ?1 and o.name=?2 这是错误的,JPA的问号索引是从1开始的,而HibernateTemplate是从0开始的,HibernateTemplate执行HQL语句时,HQL的语句中'?'号面是不带数字的
* o.key = ? and o.name=?
*/
protected void setQueryParams(Query query,Object[] queryParams) {
if(queryParams!=null && queryParams.length>0){
for(int i=0;i<queryParams.length;i++){ //JPA的问号索引是从1开始的,而HibernateTemplate是从0开始的
query.setParameter(i, queryParams[i]); //如果是JPA:i+1
}
}
}