使用 JPA 方法通过单个查询插入多条记录

Sun*_*nny 5 hibernate jpa spring-data spring-data-jpa

我有一个 Spring Boot 应用程序,我想使用单个数据库查询插入多条记录:-

public void addEvents() {
        String sql = "INSERT INTO Data values(1,'Data 1'), (2,'Data 2'),(3,'Data 3')";
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();
        entityManager.createNativeQuery(sql).executeUpdate();
        entityManager.getTransaction().commit();
    }
Run Code Online (Sandbox Code Playgroud)

实体类:-

@Entity
@Table
public class Data {
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;

    public Data(String name) {
        this.name = name;
    }

    public Data(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Data() {
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的数据是我要插入的实体。我需要在几秒钟内向数据库中插入超过 10000 行。因此,触发单个数据库调用的成本太高。因此,我为此目的使用了单个查询。该查询是本机查询。谁能告诉我 JPA 是否提供了开箱即用的 API 来在单个 DB cl 中插入多个实体?

Sha*_*tel 1

您可以使用spring-data 的saveAll方法进行批量插入。这是一个代码片段,

List<Data> dataList = <10000 records> //You need to prepare batch of 10000

dataRepository.saveAll(dataList) //Spring boot will handle batches automatically. 

Run Code Online (Sandbox Code Playgroud)

添加以下属性application.properties

spring.jpa.properties.hibernate.jdbc.batch_size=100

Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令查看生成的查询spring.jpa.show-sql

更新:在 pom.xml 中添加以下依赖项,

 <dependency>
     <groupId>com.integralblue</groupId>
     <artifactId>log4jdbc-spring-boot-starter</artifactId>
            <version>1.0.2</version>
 </dependency>
Run Code Online (Sandbox Code Playgroud)

如果批处理是否发生,上述依赖关系将显示在日志中。

  • 在这里我可以看到正在触发 1000 个 sql 查询。 (3认同)