由于不需要泄露的原因,我需要使用hibernate层运行一系列本机SQL语句。它们是“insert abc(column1,column2)values(:column1List,:column2List)”形式的相同语句(相同的绑定变量)。
如果可能的话,我想将其作为批量插入执行。可以吗?如果是这样的话?
我试过了
sqlQuery = session.createSQLQuery(sqlQuery);
sqlQuery.setParameterList(.....)
我想我发现了原因,但我不确定发生了什么。 insert语句有两列以上,hibernate将其更改为插入到abc(column1,column2,column3,column4,column5,column6)值(?,?,(?,?),(?,?),(? ,?),?)
答案 0 :(得分:1)
您可能希望将JDBC用于批量插入,这将消除与hibernate相关的开销,并允许您处理预定义参数列表
import java.sql.Connection;
import java.sql.PreparedStatement;
//...
String sql = "insert into employee (name, city, phone) values (?, ?, ?)";
org.hibernate.Session sess = (org.hibernate.Session) em.getDelegate();
Connection conn = sess.connection();
PreparedStatement ps = connection.prepareStatement(sql);
for (Employee employee: employees) {
ps.setString(1, employee.getName());
ps.setString(2, employee.getCity());
ps.setString(3, employee.getPhone());
ps.addBatch();
}
ps.executeBatch();
ps.close();
connection.close();
的例子
答案 1 :(得分:1)
我正在休眠4.1.4。我尝试了每一个我能想到的技巧让它发挥作用。因此我处于休眠状态4.我不得不求助于实现一个工作“org.hibernate.jdbc.Work”的类。一旦我有一个声明处理,一切顺利,我得到了我的答案。 DaveB概述了这种方法。
Transaction tx = session.beginTransaction() ;
SqlWork sqlWork = new SQLWork(a,b,c) ; // used inside execute <br/>
session.doWork(sqlWork) ;
tx.commit();
} catch (HibernateException he) {
tx.rollback();
} finally {
session.close()
}