我可以一次插入多行吗?

时间:2014-11-20 10:20:41

标签: java mysql performance hibernate jpa

我有一个场景,我需要在一个表中插入n行,其中只有一个列值会有所不同,其余值将保持不变。

我的印象是没有办法一次插入n条记录。如果我错了,请纠正我。

提前感谢。

我正在尝试以下查询

INSERT INTO table1 (project_id,assumption_id,VALUE,created_at,updated_at)
VALUES (SELECT id FROM projects WHERE custom=0),7622,NULL,'2013-09-10 17:18:49','2013-09-10 17:18:49');

3 个答案:

答案 0 :(得分:2)

参考文件说:

  

仅支持INSERT INTO ... SELECT ...表单;不是INSERT   INTO ... VALUES ...表格。

     

properties_list类似于中的列规范   SQL INSERT语句。对于涉及映射继承的实体,   只能使用在给定类级别上直接定义的属性   在properties_list中。不允许使用超类属性   子类属性没有意义。换句话说,INSERT   语句本质上是非多态的。

因此,如果您已经有一个用于插入的选择条件,则可以运行:

int createdEntities = s.createQuery( "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..." )
    .executeUpdate();

另一种选择是使用batch JDBC inserts,为此您需要设置以下Hibernate属性:

<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.jdbc.fetch_size" value="50"/>
<property name="hibernate.jdbc.batch_size" value="30"/>
<property name="hibernate.default_batch_fetch_size" value="50"/>

要进行更新,您可以使用DML-style bulk UPDATE

int updatedEntities = s.createQuery( "update YourEntity set yourProperty = :newValue where yourProperty = :oldValue" )
    .setString( "newValue", newValue )
    .setString( "oldValue", oldValue )
    .executeUpdate();

答案 1 :(得分:1)

我猜有很多方法可以做到。

为什么不做一个循环?

While ($x <= $limit){
 // insert query goes here
}

答案 2 :(得分:1)

是的,你可以。您只需要每次都创建一个新对象,而不是重复使用旧对象,只需更改其中的一些字段。

MyObject obj;
for (...) {
    obj = new MyObject(...);
    session.save(obj);
}