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

时间:2015-05-19 10:31:06

标签: spring jpa spring-data-jpa

以下是我的表架构

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实体);我加入了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 (?)

如何限制为一个插入查询?任何答案都有助于弹簧数据jpa,hql或jpql。

1 个答案:

答案 0 :(得分:1)

假设您正在使用休眠,则需要调整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");

可以找到更多解释的博客文章here

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