Spring 数据 jpa,如何编写自定义查询以在同一个 table 中插入多条记录?

Spring data jpa, how to write custom query for inserting multiple records in same table?

以下是我的 table 架构

CREATE TABLE Animals (

     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
) ENGINE=MyISAM;

在mysql中我可以直接在一次插入sql查询中插入多条记录。喜欢关注

INSERT INTO animals (name) VALUES('dog'),('cat'),('penguin'),('lax'),('whale'),('ostrich');

但是,我怎样才能在 spring 数据 jpa 中实现同样的事情。

现在我正在使用 CrudRepository 的 Iterable save(Iterable entities);我得到了 6 个插入语句

insert into Animals (name) values (?)

insert into Animals (name) values (?)

insert into Animals (name) values (?)

insert into Animals (name) values (?)

insert into Animals (name) values (?)

insert into Animals (name) values (?)

如何限制为一次插入查询?关于 spring 数据 jpa、hql 或 jpql 的任何答案都会有所帮助。

假设您正在使用休眠,您需要调整 a couple of settings。您需要通过在 hibernate.jdbc.batch_size 属性 中输入一个值来启用批处理。然而,这可能不会削减它,因为取决于不同语句的数量,您可能还需要订购它们才能对它们进行批处理。为此,您需要将 hibernate.order_insertshibernate.order_updates 设置为 true

如果您使用版本或时间戳来限制并发修改,您可能还需要启用 hibernate.jdbc.batch_versioned_data

所以总而言之,你可能需要在你的配置中添加这样的东西或者 persistence.xml

properties.put("hibernate.jdbc.batch_size", "25");
properties.put("hibernate.order_inserts", "true");
properties.put("hibernate.order_updates", "true");
properties.put("hibernate.jdbc.batch_versioned_data", "true");

可以找到一个博客 post 解释更多 here

但是,如果您使用的是 MySQL,它甚至可能无法正常工作(目前),因为 MySQL 需要对数据源进行额外的设置才能为 [=] 启用 addBatch 35=]。您需要将 rewriteBatchedStatements 设置为 true 才能为 MySQL 启用此功能。根据您的数据源,您可以将其添加到连接字符串或作为单独的 属性.