2011-06-07 120 views
3

使用JPA,我已經從我的數據庫條目列表:有沒有辦法根據列表更新數據庫字段?

User(id, firstname, lastname, email) 

我得到這樣做:

List<User> users = User.find("lastname = ?", "smith"); 

而且我想更新所有在一個請求,通過做一些事情像這樣:

"UPDATE USER SET email = null IN :list" 

,然後設置參數 「表」 來users

這可能嗎?如果是這樣,怎麼樣?

感謝您的幫助:)如果你有JPA + Hibernate,您可以使用entityManager.createQuery()創建HQL查詢 像

回答

3

嗯,你可以嵌入查詢您用於獲取更新的where子句中的列表。

UPDATE User a SET a.email = null 
WHERE user IN (SELECT b FROM User b WHERE lastName = :?) 

通過這樣做,您將執行查詢以在單個更新查詢中搜索列表和更新。

你覺得怎麼樣?你認爲這可行嗎?

CNC中

既然你要使用的物品,而不是從數據庫中檢索的只是一個列表的原始列表,你仍然可以確保你建立這樣

UPDATE User a SET a.email = null 
WHERE user IN (SELECT b FROM User b WHERE lastName IN(:originalList)) 
原始列表

然後,當你調用它,你可以做這樣的事情:

Collection<String> originalList = Arrays.asList("Kenobi", "Skywalker", "Windu"); 
query.setParameter("originalList", originalList); 

通過這種方式,你仍然可以保證查詢將只包含原始列表中的項目,並且不包含數據庫中的任何可能的新項目,前提是該姓氏是數據庫中的候選項鍵,否則我會建議您使用該ID作爲姓氏的子查詢擴展名。

+0

問題是,我所搜索的用戶列表可能隨時間而改變,我擔心更新會影響這些更改。我想保留當前選定用戶的更新。 – 2011-06-07 19:00:53

+0

@ cx42net您仍然可以使用原始列表作爲查詢的參數。我已更新該帖子以展示我如何相信可以完成的一個例子。 – 2011-06-07 20:22:34

+0

工程就像一個魅力!完善!我開始用同樣的方法,使用String [],但是IN(:list)不起作用,我不得不做一個'join(「,」,names)',而這並不是很漂亮所有!你的解決方案更好!謝謝! – 2011-06-07 21:13:52

0

String hql = "UPDATE Supplier SET name = :newName WHERE name IN :name"; 
entityManager.createQuery(hql); 
+0

好吧,我終於測試它,它不起作用。列表「name」是Supplier實例的列表,而不是String列表。基於此,請求失敗,因爲它期望一個字符串列表而不是供應商列表。 – 2011-06-07 15:41:41

+0

除此之外,如果使用JPA,則em.createQuery用於JPQL而不用HQL。 – DataNucleus 2011-06-08 06:10:21

相關問題