我试图使用hibernate sql-query执行SQL本机脚本。该脚本如下:
<sql-query name="setAllColors" >
UPDATE chair
SET COLOR = 'Grey' WHERE NAME='AustrianWinter';
UPDATE chair
SET COLOR = 'Brown' WHERE NAME='ItalianSummer';
</sql-query>
如果我在Mysql中执行相同的查询(它使用的是数据库),一切正常。如果我尝试通过代码执行它,回想一下存储此查询的xml,我得到:
could not execute native bulk manipulation query
THE STRANGE FACT是如果我尝试只执行第一次更新,而没有第二次更新,一切正常。 有关如何避免此错误的任何想法?
答案 0 :(得分:1)
在db中运行正常,因为MySQL按顺序执行它们。
在休眠状态下,你无法做到。你必须在单独的sql-query中定义每个更新语句。
但是你可以试试smth:
UPDATE chair SET color = CASE WHEN NAME='AustrianWinter' THEN 'Grey' ELSE 'Brown' END WHERE NAME IN ('AustrianWinter', 'Brown')
答案 1 :(得分:0)
如果您想要简单的案例,可以使用@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>
更新2: 当你使用DriverManagerDataSource时,allowMultiQueries它不是连接的一部分,你应该把它作为属性。
来自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>