【问题标题】:Hibernate./JPA native bulk insert with on duplicate key update issueHibernate./JPA 本机批量插入与重复键更新问题
【发布时间】:2021-03-18 04:28:44
【问题描述】:

我已使用此函数通过插入或更新生成对 MySQL 5.7 的批量插入

private String bulkInsertQuery(List<ProducDetails> productDetailsList){
    StringBuilder prodBatchInsert=new StringBuilder("INSERT INTO product_details(prod_id, prod) VALUES ");
    StringBuilder prodBatchInsertOnDuplicateKey=new StringBuilder(" ON DUPLICATE KEY UPDATE prod=VALUES(prod)");
    productDetailsList.forEach((ProductDetails row)->{
        prodBatchInsert.append("(");
        prodBatchInsert.append("\""+row.getProdId()+"\"");
        prodBatchInsert.append(",");
        prodBatchInsert.append("\""+row.getProd()+"\"");
        prodBatchInsert.append(")");
        prodBatchInsert.append(",");
    });
    String insertSql=prodBatchInsert.toString();
    return insertSql.substring(0,insertSql.length()-1).concat(prodBatchInsertOnDuplicateKey.toString());
}

Query query=entityManager.createQuery(bulkInsertQuery(productDetailsList));
            query.executeUpdate();

最初,我使用单引号,但由于这种类型的数据产品名称(如 ABC'S FOOD)包含单引号而失败,然后我切换到上面的双引号

我想知道是否有办法解决这个问题或使用参数化查询批量插入更新重复键。

【问题讨论】:

标签: java mysql hibernate jpa


【解决方案1】:

您可以为此使用@SQLInsert 来使用批量插入。见Hibernate Transactions and Concurrency Using attachDirty (saveOrUpdate)

【讨论】:

  • 检查另一个堆栈溢出帖子中的示例:)
  • 我现在遇到了这个问题 javax.persistence.EntityExistsException:具有相同标识符值的不同对象已与会话关联
  • 您为什么要尝试使用相同的持久化上下文多次持久化同一个对象?在运行此过程之前,请先尝试对您的列表进行重复数据删除。
猜你喜欢
  • 2011-02-15
  • 2012-02-16
  • 2011-01-19
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2017-01-31
  • 2013-07-11
  • 2011-11-13
相关资源
最近更新 更多