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

JPA查询出现unexpected token错误:更新员工薪资语句问题求助

解决JPA更新查询的「unexpected token」错误

嘿,我一看你这段代码就发现几个导致报错的问题,咱们一个个理清楚,很快就能搞定:

问题分析与修复步骤

1. JPQL要面向实体类,不是数据库表

JPA的查询语言(JPQL)是基于你的Java实体类的,不是直接写数据库表名。你写的update employee里的employee应该是数据库表名吧?得换成你的实体类名称,比如如果你的实体类叫Employee(Java里实体类一般首字母大写),就改成UPDATE Employee。

2. 字段名要和实体类属性保持一致

你查询里同时用了sal和salary,这明显是混用了!得确认你的Employee实体类里薪资对应的属性名到底是啥:

  • 如果实体类属性是salary,那整个查询里都要统一用salary;
  • 如果实体类属性是sal,那where条件里的salary就得改成sal。
    比如假设实体类里属性是salary,那查询应该改成:
UPDATE Employee SET salary = salary + 2000 WHERE salary < :sal

3. 缺少修改操作必需的注解

执行更新/删除这类写操作的JPQL,必须加上@Modifying注解,告诉Spring Data这不是查询操作,而是修改操作。另外,这类操作必须在事务环境下运行,所以还要加上@Transactional注解(可以加在Repository方法上,也可以加在调用它的服务层方法上)。

修正后的完整代码示例

Repository层代码

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Modifying
    @Transactional
    @Query("UPDATE Employee e SET e.salary = e.salary + 2000 WHERE e.salary < :sal")
    void updateEmployeeSalary(@Param("sal") Long sal);
}

这里给实体类加了别名e,让代码更清晰,也符合JPQL的常用写法。

服务层代码

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service
public class EmployeeService {

    private final EmployeeRepository repo;

    // 推荐用构造注入,避免字段注入的弊端
    public EmployeeService(EmployeeRepository repo) {
        this.repo = repo;
    }

    // 这里加@Transactional也可以,和Repository层的选一个就行,一般服务层管理事务更灵活
    @Transactional
    public List<Employee> updateSalary(Long sal){
        repo.updateEmployeeSalary(sal);
        return repo.findAll();
    }
}

最后再检查两点

  • 确认你的Employee实体类和数据库表的映射是正确的,比如如果数据库列名是sal但实体类属性是salary,要加上@Column(name = "sal")来映射;
  • 如果还是报错,把完整的错误栈信息贴出来,能更快定位问题,但按照上面的步骤改完,大概率能解决这个「unexpected token」的问题啦。

内容的提问来源于stack exchange,提问作者Anilkumar Jirali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:14:07