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

其实这个解决方案是更有趣。但它似乎并没有为我工作..我改变我的hib配置从 jdbc:mysql:// localhost:3306/chairDB to jdbc:mysql:// localhost:3306/chairDB?allowMultiQueries = true我做了一个干净的构建,然后回想起查询......但仍然抛出错误。我是否缺少别的东西? – BabaNew

+0

请说明你如何运行这个查询得到它?你只有一个hib配置文件吗? – xyz

+0

我编辑了这个问题,更多的信息:)谢谢你的方式 – BabaNew

在数据库工作正常,因为MySQL顺序执行它们。 在休眠期间,你不能那样做。你必须在单独的sql-query中定义每个更新语句。

但是你可以尝试像水木清华:

UPDATE chair SET color = CASE WHEN NAME='AustrianWinter' THEN 'Grey' ELSE 'Brown' END WHERE NAME IN ('AustrianWinter', 'Brown')