hibernate nativesqlquery批量插入
Posted
技术标签:
【中文标题】hibernate nativesqlquery批量插入【英文标题】:hibernate nativesqlquery batch insert 【发布时间】:2014-01-27 17:13:02 【问题描述】:出于不需要透露的原因,我需要使用hibernate层运行一系列原生SQL语句。它们是“insert abc(column1,column2) values(:column1List, :column2List)”形式的相同语句(相同的绑定变量)。
如果可能,我想将其作为批量插入执行。可以做到吗?如果有怎么办?
我试过了
sqlQuery = session.createSQLQuery(sqlQuery);
sqlQuery.setParameterList(.....)
我想我找到了原因,但我不确定发生了什么。 insert 语句有超过 2 列,hibernate 将其更改为 insert into abc(column1, column2, column3, column4,column5, column6) 值(?,?, (?,?),(?,?),(? ,?),?)
【问题讨论】:
【参考方案1】:您可能希望考虑使用 JDBC 进行批量插入,这将消除与休眠相关的开销并允许您处理预定义参数列表
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/)
【讨论】:
我使用的系统没有像您的示例中那样为我提供来自会话对象的连接。我正在从 hibernatesessionfactory 获取会话。你知道我怎样才能得到连接吗?还是我必须得到 entityManager ?如果是这样,我如何获得 entityManager ?谢谢...对休眠不太了解..我在休眠4.1.4 嗨 @EnderWiggin 是的,EntityManager 位可能与您的情况无关,但是一旦您掌握了 Hibernate 会话,其余部分应该是相同的【参考方案2】:我在休眠 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()
【讨论】:
以上是关于hibernate nativesqlquery批量插入的主要内容,如果未能解决你的问题,请参考以下文章