【问题标题】:How to run mysql update batch query in Hibernate?如何在 Hibernate 中运行 mysql 更新批量查询?
【发布时间】:2018-11-05 12:09:45
【问题描述】:

我有一个 mysql (SQL) 批处理查询:

START TRANSACTION;

UPDATE home SET currentSeq = 2 WHERE resId = '6hiuxhqkw4s1bta9a';
UPDATE home SET currentSeq = 4 WHERE resId = 'hpvihvzk0vainpkgg';
UPDATE home SET currentSeq = 6 WHERE resId = 'krfswe6wohjtugmtd';
UPDATE home SET currentSeq = 3 WHERE resId = 'tcybuiuulkju5wjre';
UPDATE home SET currentSeq = 7 WHERE resId = 'sgs4gr4v6aepuwdgq';

COMMIT;

上面的代码在 MySQl 5.7 终端上运行时工作正常但是,我试图从 Hibernate 运行相同的查询,而 Hibernate 给出了一个异常 - “不支持嵌套查询”。

我的休眠代码:

String queryToBeUpdate = "START TRANSACTION;\n" + 
            "\n" + 
            "UPDATE home SET currentSeq = 2 WHERE resId = '6hiuxhqkw4s1bta9a';\n" + 
            "UPDATE home SET currentSeq = 4 WHERE resId = 'hpvihvzk0vainpkgg';\n" + 
            "UPDATE home SET currentSeq = 6 WHERE resId = 'krfswe6wohjtugmtd';\n" + 
            "UPDATE home SET currentSeq = 3 WHERE resId = 'tcybuiuulkju5wjre';\n" + 
            "UPDATE home SET currentSeq = 7 WHERE resId = 'sgs4gr4v6aepuwdgq';\n" + 
            "\n" + 
            "COMMIT;";

Query q =sessionFactory.getCurrentSession().createSQLQuery(queryToBeUpdate);
q.executeUpdate();

【问题讨论】:

  • 可能是createSQLQuery函数不支持多个用分号分隔的SQL语句(;)
  • 我不知道这是否可以从 Hibernate 完成。它可以从 JDBC 完成,在这种情况下,您将关闭自动提交,然后运行每个更新。 START TRANSACTION ... COMMIT 标记用于原始 MySQL,而不是 JDBC。
  • @RaymondNijland 我认为你是对的。我们可以直接从 JDBC 执行此操作,但总的来说这可能不是一个好主意。
  • 如果您查看文档docs.jboss.org/hibernate/orm/3.3/reference/en/html/…,您可以看到createSQLQuery 正在创建一个`SQLQuery?` 对象。我看到可以进行JOINS,但我没有找到可能的方法允许多个 SQL 语句..
  • 顺便可以把所有的更新查询改写成一个更新查询,不是hibernate的东西而是纯SQL代码..然后只需要执行三个查询..

标签: java mysql sql spring hibernate


【解决方案1】:

您可以像这样将 UPDATE 与 CASE 结合起来:

String queryToBeUpdate = "UPDATE home SET currentSeq = (CASE 
                          WHEN  resId = '6hiuxhqkw4s1bta9a' THEN '2' 
                          WHEN  resId = 'hpvihvzk0vainpkgg' THEN '4' 
                          WHEN  resId = 'krfswe6wohjtugmtd' THEN '6' 
                          WHEN  resId = 'tcybuiuulkju5wjre' THEN '3' 
                          WHEN  resId = 'sgs4gr4v6aepuwdgq' THEN '7' 
                          END)
                          WHERE resId IN(6hiuxhqkw4s1bta9a,hpvihvzk0vainpkgg,krfswe6wohjtugmtd,tcybuiuulkju5wjre,sgs4gr4v6aepuwdgq) ";
 SQLQuery query = session.createSQLQuery(strq);
 query.executeUpdate(queryToBeUpdate);

(作为批量更新查询)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2016-08-12
    • 2019-01-09
    • 1970-01-01
    • 2018-09-11
    • 2018-04-09
    • 2012-06-10
    相关资源
    最近更新 更多