命名sql-query:无法执行本机批量操作查询(但脚本工作正常时,直接在数据库中执行)
问题描述:
我试图执行SQL本机脚本使用休眠sql查询。该脚本如下:命名sql-query:无法执行本机批量操作查询(但脚本工作正常时,直接在数据库中执行)
<sql-query name="setAllColors" >
UPDATE chair
SET COLOR = 'Grey' WHERE NAME='AustrianWinter';
UPDATE chair
SET COLOR = 'Brown' WHERE NAME='ItalianSummer';
</sql-query>
如果我执行在MySQL这个相同的查询(这是我使用的是DB)一切工作正常。如果我试着通过代码来执行它,回顾在那里此查询存储在XML中,我得到:
could not execute native bulk manipulation query
的奇怪的事实是,如果我尝试只执行第一次更新,没有第二个,所有的作品精细。 有关如何避免此错误的任何想法?
答
,如果你想简单的情况下,你给了,你可以使用回答@Adrian。
但 - @Adrian '在冬眠你不能这样做。' - 这不是真的。 它不是休眠限制,它是限制jdbc连接。默认情况下不允许有多个查询。但是您可以将设置数据库连接属性设置为允许多个查询,默认情况下用分号分隔。这是附加的连接属性。
allowMultiQueries =真
的jdbc:mysql的://本地主机:3306/hibernate_db allowMultiQueries =真
与WHIS选项,您可以执行:
<sql-query name="setAllColors" >
UPDATE chair
SET COLOR = 'Grey' WHERE NAME='AustrianWinter';
UPDATE chair
SET COLOR = 'Brown' WHERE NAME='ItalianSummer';
</sql-query>
UPDATE 2: 当您使用DriverManagerDataSource时,允许MultiQueries它不是连接的一部分,你应该把它作为属性。
从AbstractDriverBasedDataSource
/**
* Specify arbitrary connection properties as key/value pairs,
* to be passed to the Driver.
* <p>Can also contain "user" and "password" properties. However,
* any "username" and "password" bean properties specified on this
* DataSource will override the corresponding connection properties.
* @see java.sql.Driver#connect(String, java.util.Properties)
*/
public void setConnectionProperties(Properties connectionProperties) {
this.connectionProperties = connectionProperties;
}
所以,配置应该是:
<bean id="dataSourceBean" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/chairDB"/>
<property name="username" value="root"/>
<property name="password" value="pass123"/>
<property name="connectionProperties">
<props>
<prop key="allowMultiQueries">true</pro>
</props>
</property>
</bean>
答
在数据库工作正常,因为MySQL顺序执行它们。 在休眠期间,你不能那样做。你必须在单独的sql-query中定义每个更新语句。
但是你可以尝试像水木清华:
UPDATE chair SET color = CASE WHEN NAME='AustrianWinter' THEN 'Grey' ELSE 'Brown' END WHERE NAME IN ('AustrianWinter', 'Brown')
其实这个解决方案是更有趣。但它似乎并没有为我工作..我改变我的hib配置从 jdbc:mysql:// localhost:3306/chairDB to jdbc:mysql:// localhost:3306/chairDB?allowMultiQueries = true 我做了一个干净的构建,然后回想起查询......但仍然抛出错误。我是否缺少别的东西? –
BabaNew
请说明你如何运行这个查询得到它?你只有一个hib配置文件吗? – xyz
我编辑了这个问题,更多的信息:)谢谢你的方式 – BabaNew