【发布时间】: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