2017-07-02 60 views
0

我試圖執行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 

的奇怪的事實是,如果我嘗試只執行第一次更新,沒有第二個,所有的作品精細。 有關如何避免此錯誤的任何想法?

回答

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> 

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

1

在數據庫工作正常,因爲MySQL順序執行它們。 在休眠期間,你不能那樣做。你必須在單獨的sql-query中定義每個更新語句。

但是你可以嘗試像水木清華:

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