我有一个场景,我需要在一个表中插入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');
答案 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);
}