JPA @Modifying Update查询关联条件语法错误问题排查
问题分析与解决方案
这不是JPA Update查询的预期行为,是特定版本范围内Hibernate处理关联条件Update查询时的语法生成bug。
问题原因
你的JPQL Update语句引用了关联实体Product的属性,但Hibernate在解析这类无显式JOIN的查询时,错误生成了MySQL不支持的cross join语法。MySQL的UPDATE多表操作不允许这种写法,而Select查询的语法解析逻辑与Update不同,所以能正常生成正确的JOIN语句。
解决方案
以下几种方式可以解决这个问题:
显式添加JOIN到JPQL
修改JPQL语句,显式关联Product实体,让Hibernate生成符合MySQL要求的多表UPDATE语法:@Modifying @Query("update Test t join t.product p set t.worker = :workerToEdit where p.deleted = false") void editTest(Worker workerToEdit);该写法基于JPA 2.1规范,Spring Boot 2.1.x对应的Hibernate版本完全支持。
改用原生SQL查询
如果JPQL的写法仍有问题,直接使用适配MySQL的原生SQL:@Modifying @Query(value = "update test t inner join product p on t.product_id = p.id set t.worker_id = :workerId where p.deleted = false", nativeQuery = true) void editTest(@Param("workerId") Long workerId);注意原生SQL要使用数据库字段名(如
worker_id、product_id)而非实体属性名。确保依赖版本统一升级
Spring Boot 2.1.7对应的Hibernate 5.3.10.Final确实存在该bug,若升级后问题未解决,需检查是否统一升级了整个Spring Boot依赖(而非单独升级JPA/Hibernate)。Spring Boot 2.2.x及以上版本(对应Hibernate 5.4+)已修复该问题。
内容的提问来源于stack exchange,提问作者davidarroyo1234
相关产品推荐
相关产品推荐

