HQL语法错误与位置参数过时警告问题求助
解决Hibernate持久层开发的两个问题
咱们逐个解决你遇到的问题:
1. 语法错误:unexpected AST node: . near line 1, column 63
这个错误的根源是update语句的HQL不完整,看你写的这句:
Query qr=s.createQuery("Update Employee e set e.empSal=10000 where e.deptNumber");
where e.deptNumber后面缺少了比较操作符和匹配值的逻辑,Hibernate无法识别这个不完整的条件,所以抛出语法错误。你需要补上= ?(或者结合第二个问题用推荐的参数形式),把语句补全。
2. 过时警告:Positional parameter are considered deprecated
Hibernate已经不推荐使用?这种老式位置参数了,官方建议用命名参数或者JPA风格的位置参数(如?1、?2),前者可读性更高,还能避免参数顺序错乱的问题,后者更贴近JPA规范。
推荐修正方案:使用命名参数
下面是修改后的完整EmpDaoImpl类,同时解决了两个问题:
package com.sathya.dao; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.sathya.util.HibernateUtil; public class EmpDaoImpl implements IEmpDao { private SessionFactory factory; public EmpDaoImpl() { factory=HibernateUtil.getSessionFactory(); } public List findEmpsByDeptNum(int deptNumber) { Session session=factory.openSession(); // 用命名参数:deptNumber替代老式位置参数 Query q=session.createQuery("from Employee e where e.deptNumber = :deptNumber"); q.setParameter("deptNumber", deptNumber); List list=q.list(); session.close(); return list; } public int updateEmpsByDeptNum(int deptNumber) { Session s=factory.openSession(); // 补全where条件,同时使用命名参数 Query qr=s.createQuery("Update Employee e set e.empSal=10000 where e.deptNumber = :deptNumber"); qr.setParameter("deptNumber", deptNumber); Transaction tx=s.beginTransaction(); int i=qr.executeUpdate(); tx.commit(); s.close(); return i; } }
备选方案:使用JPA风格位置参数
如果你更习惯用位置参数,可以改成?1(代表第一个参数)的形式,示例如下:
// findEmpsByDeptNum方法的HQL和参数绑定 Query q=session.createQuery("from Employee e where e.deptNumber = ?1"); q.setParameter(1, deptNumber); // updateEmpsByDeptNum方法的HQL和参数绑定 Query qr=s.createQuery("Update Employee e set e.empSal=10000 where e.deptNumber = ?1"); qr.setParameter(1, deptNumber);
这样修改后,语法错误会因为补全的where条件消失,过时警告也会因为使用了Hibernate推荐的参数绑定方式而消除。
内容的提问来源于stack exchange,提问作者sai
相关产品推荐
相关产品推荐

