2014-01-27 67 views
3

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

我想这样做,如果可能的批量插入。可以做到吗?如果是这样如何?

我试图 sqlQuery = session.createSQLQuery(sqlQuery); sqlQuery.setParameterList(.....)

我想我找到了原因,但我不知道发生了什么。 insert语句有2个以上的列,hibernate将它改为插入abc(column1,column2,column3,column4,column5,column6)的值(?,?,(?,?),(?,?), ,?),?)

回答

1

我在hibernate 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() 
} 
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/)的示例

+0

我正在使用的系统没有给我一个来自会话对象的连接,就像你的例子。我从hibernatesessionfactory获取会话。你知道我如何获得连接吗?或者我必须得到entityManager?如果是这样,我如何获得entityManager?谢谢...不是太熟悉hibernate ..我在休眠4.1.4 –

+0

嗨@EnderWiggin是的EntityManager位可能与您的情况不相关,但是一旦您掌握了Hibernate会话,其余的应该是相同的 – DaveB