如何仅使用JPA @Query通过单条查询实现Oracle双表插入?
Oracle环境下JPA单语句双表插入实现方案
核心实现依赖Oracle原生INSERT ALL语法,无需PL/SQL的begin块,无需定义表关联关系,单条DML语句即可完成多表插入,完全符合你的约束要求。
具体实现步骤
- 首先确认两张表的插入字段规则,无需做实体类关联映射,直接编写原生SQL绑定参数即可
- 在JPA的Repository接口中添加插入方法,必须搭配
@Modifying、@Transactional注解,同时开启nativeQuery = true使用原生SQL - 示例代码如下,假设需要插入的两张表为
table_a(字段a_id/a_name/create_time)和table_b(字段b_id/b_name/create_time):
import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.transaction.annotation.Transactional; public interface BatchInsertRepository extends CrudRepository<Object, Long> { @Modifying @Transactional @Query(value = "INSERT ALL " + "INTO table_a (a_id, a_name, create_time) VALUES (:aId, :insertName, sysdate) " + "INTO table_b (b_id, b_name, create_time) VALUES (:bId, :insertName, sysdate) " + "SELECT 1 FROM dual", nativeQuery = true) int insertTwoTables(Long aId, Long bId, String insertName); }
INSERT ALL语法规则:可跟随任意多个INTO子句,每个子句对应一张表的插入逻辑,末尾必须跟SELECT子句(无业务查询需求时直接查dual表的固定值即可),整条语句属于标准单条DML,没有嵌套PL/SQL块,也不需要依赖表关联。
注意事项
- 方法返回的int值为所有表插入成功的总条数,双表单条插入场景下成功时返回值为2
- 如果插入数据来源是某张业务表的查询结果,直接把末尾的
SELECT 1 FROM dual替换为对应的业务查询语句即可,所有INTO子句可以直接引用查询结果的字段值 - 执行前需要确认当前数据库账号拥有两张表的INSERT权限
内容的提问来源于stack exchange,提问作者Ganesh Java
相关产品推荐
相关产品推荐

