You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:41:41