命名 sql-查询:无法执行本机批量操作查询(但直接在数据库中执行时脚本工作正常)
Named sql-query: could not execute native bulk manipulation query (but script works fine when executed directly in DB)
我正在尝试使用休眠 sql-查询执行 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
奇怪的事实是,如果我尝试只执行第一个更新,而不执行第二个更新,一切正常。
关于如何避免此错误的任何想法?
In db 工作正常,因为 MySQL 按顺序执行它们。
在休眠模式下你不能这样做。您必须在单独的 sql-query.
中定义每个更新语句
不过你可以试试:
UPDATE chair SET color = CASE WHEN NAME='AustrianWinter' THEN 'Grey' ELSE 'Brown' END WHERE NAME IN ('AustrianWinter', 'Brown')
如果你想要简单的案例,你可以使用@Adrian 的回答。
但是 - @Adrian '在休眠状态下你不能那样做。' -- 这不是真的。
这不是休眠限制,它是限制 jdbc 连接。默认情况下不允许有多个查询。 BUT你可以设置设置数据库连接属性允许多个查询,用分号分隔default.This是附加连接属性.
allowMultiQueries=true
jdbc:mysql://localhost:3306/hibernate_db?allowMultiQueries=true
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 它不是连接的一部分,您应该将其作为 Properties.
来自 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>
我正在尝试使用休眠 sql-查询执行 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
奇怪的事实是,如果我尝试只执行第一个更新,而不执行第二个更新,一切正常。 关于如何避免此错误的任何想法?
In db 工作正常,因为 MySQL 按顺序执行它们。
在休眠模式下你不能这样做。您必须在单独的 sql-query.
不过你可以试试:
UPDATE chair SET color = CASE WHEN NAME='AustrianWinter' THEN 'Grey' ELSE 'Brown' END WHERE NAME IN ('AustrianWinter', 'Brown')
如果你想要简单的案例,你可以使用@Adrian 的回答。
但是 - @Adrian '在休眠状态下你不能那样做。' -- 这不是真的。 这不是休眠限制,它是限制 jdbc 连接。默认情况下不允许有多个查询。 BUT你可以设置设置数据库连接属性允许多个查询,用分号分隔default.This是附加连接属性.
allowMultiQueries=true
jdbc:mysql://localhost:3306/hibernate_db?allowMultiQueries=true
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 它不是连接的一部分,您应该将其作为 Properties.
来自 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>