2015-05-07 106 views
0

我有一個更新查詢像這樣JPA批量更新語句

Update Table name set valstring = ? where valstring = ? and ID in (?) 

所以JPA交易

em.CreateNativeQuery(Update_QUERY).setParameter(1, updatedStatus).setParameter(2,currentStatus).setParameter(3,ids).executeUpdate(); 

的輸入法列表ID,currentStatus和updatedStatus

如何將列表作爲單個參數傳遞,如果將List轉換爲逗號分隔的字符串我得到錯誤指定的文本不是數字,因爲In子句中不允許使用字符串

+0

爲什麼要使用「本地查詢」時JPQL不更新也 –

+0

我是新來JPQL所以不能找到一種方法,我可以通過ID列表中,如果您有任何建議,請讓我知道 – avenirit12

+0

爲已經說過...使用JPQL更新,並支持輸入列表作爲參數值 –

回答

4

我如何通過列表作爲單個參數

一個例子方法:

String jpql = "UPDATE NameEntity ne " + 
       "SET ne.valstring = :updated_status " + 
       "WHERE ne.valstring = :current_status AND ne.id IN :ids"; 
em.createQuery(jqpl) 
    .setParameter("updated_status", updatedStatus) 
    .setParameter("current_status", currentstatus) 
    .setParameter("ids", Arrays.asList(ids)) 
    .executeUpdate(); 

三個簡單的規則:

  1. 使用批量更新本地SQL/而不是映射到實體的表上刪除。

    本機SQL查詢直接在數據庫表上工作,繞過持久性上下文(一組管理實體),因此如果給定的數據庫表沒有相應的實體,則使用這樣的查詢是安全的。

  2. 使用JPQL批量更新/刪除映射到實體

    在給定的數據庫表的情況下,由實體映射表,使用SQL更新/刪除會導致持久化上下文之間的不一致性底層的數據庫,所以請使用JQPL的對應部分,而持久性提供者會考慮一致性。

  3. 批量更新/刪除應該作爲事務內的第一個操作或理想情況下在其自己的事務中執行。

+0

由於ID在NamedEntity中爲我聲明爲int我得到錯誤參數值元素與預期類型不匹配 – avenirit12

+0

你究竟傳遞了什麼'Arrays.asList(ids)''中的'ids'? – wypieprz

+0

列表已通過 – avenirit12