Hibernate查询命名参数未绑定求助:Spring Data更新语句报错
解决方案
方案1:使用JPQL而非原生SQL(推荐)
当开启nativeQuery=true时,Spring Data不支持通过对象属性的点路径(如:table.eventDate)绑定参数,这是原生SQL参数绑定的固有限制。改用JPQL即可支持对象属性引用,同时JPQL基于实体类和属性名编写,更契合Spring Data的设计逻辑:
@Modifying @Transactional @Query("update Table u set u.eventDate = :table.eventDate, u.clientId = :table.clientId, u.status = :table.status, u.statusDate = :table.statusDate, u.creationDate = :table.creationDate, u.lastUpdateDate = :table.lastUpdateDate where u.id = :table.id") void updateEntity(@Param("table") Table table);
注意事项:
- 移除
nativeQuery=true,JPQL使用实体类名(Table)而非数据库表名(Table_name) - JPQL中使用Java实体的属性名(如
eventDate)而非数据库列名(event_date) - 更新操作必须添加
@Transactional注解,否则会触发事务相关异常 - 无需更新
u.id,where条件已限定u.id = :table.id,更新主键无实际意义
方案2:保留原生SQL,拆分参数绑定
如果必须使用原生SQL,需将对象的每个属性单独作为参数传入,不能直接传递整个对象并通过点路径引用:
@Modifying @Transactional @Query(value = "update Table_name u set u.event_date = :eventDate, u.client_id = :clientId, u.status = :status, u.status_date = :statusDate, u.creation_date = :creationDate, u.last_update_date = :lastUpdateDate where u.id = :id", nativeQuery = true) void updateEntity( @Param("id") Long id, @Param("eventDate") LocalDateTime eventDate, @Param("clientId") Long clientId, @Param("status") String status, @Param("statusDate") LocalDateTime statusDate, @Param("creationDate") LocalDateTime creationDate, @Param("lastUpdateDate") LocalDateTime lastUpdateDate );
调用时需从Table对象中提取对应属性传入方法。
额外提示
- 核对实体类
Table的属性名与JPQL中的使用是否一致,避免拼写错误 - 若使用Spring Boot 2.x及以上版本,可给
@Modifying添加clearAutomatically = true参数,规避一级缓存脏数据问题:@Modifying(clearAutomatically = true)
内容的提问来源于stack exchange,提问作者cristiiiii
相关产品推荐
相关产品推荐

