命名 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>