【问题标题】:hibernate nativesqlquery batch inserthibernate nativesqlquery批量插入
【发布时间】: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) 值(?,?, (?,?),(?,?),(? ,?),?)

【问题讨论】:

    标签: java hibernate batch-file


    【解决方案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()
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 2012-02-16
      • 2015-07-03
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多