hibernate nativesqlquery批量插入

时间:2014-01-27 17:13:03

标签: java hibernate batch-file

由于不需要泄露的原因,我需要使用hibernate层运行一系列本机SQL语句。它们是“insert abc(column1,column2)values(:column1List,:column2List)”形式的相同语句(相同的绑定变量)。

如果可能的话,我想将其作为批量插入执行。可以吗?如果是这样的话?

我试过了 sqlQuery = session.createSQLQuery(sqlQuery); sqlQuery.setParameterList(.....)

我想我发现了原因,但我不确定发生了什么。 insert语句有两列以上,hibernate将其更改为插入到abc(column1,column2,column3,column4,column5,column6)值(?,?,(?,?),(?,?),(? ,?),?)

2 个答案:

答案 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();

取自(http://viralpatel.net/blogs/batch-insert-in-java-jdbc/

的例子

答案 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()
}