2011-06-07 119 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

相关问题