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
相关产品推荐
相关产品推荐

