2014-01-27 6 views
3

По причинам, не требующим разглашения, мне нужно запустить серию собственных операторов SQL, используя спящий уровень. Они представляют собой один и тот же оператор (такие же переменные связывания) формы «insert abc (column1, column2) values ​​(: column1List,: column2List)».hibernate nativesqlquery batch insert

Я хотел бы выполнить это как пакетную вставку, если это возможно. Это можно сделать? Если да, то как?

Я попытался sqlQuery = session.createSQLQuery(sqlQuery); sqlQuery.setParameterList(.....)

Я думаю, что я узнал причину, но я не уверен, что происходит. Оператор insert содержит более двух столбцов, а спящий режим меняет его на вставки в abc (столбцы1, столбцы2, столбцы3, столбцы4, столбцы5, столбцы6) значения (?,?, (?,?), (?,?), (? ,?) ,?)

ответ

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() 
} 
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/)

+0

Система, которую я использую, не дает мне связи с объектом сеанса, как в вашем примере. Я получаю сессию из hibernatesessfactory. Вы знаете, как я могу получить соединение? Или мне нужно получить entityManager? Если да, как мне получить entityManager? Спасибо ... Не слишком осведомлен о спящем режиме. Я нахожусь в спящем режиме 4.1.4 –

+0

Привет @EnderWiggin да бит EntityManager, вероятно, не имеет отношения к вашему делу, но как только вы овладели сеансом Hibernate, остальные должны быть одинаковыми – DaveB