【问题标题】:Is there a way to update a database field based on a list?有没有办法根据列表更新数据库字段?
【发布时间】:2011-06-07 12:52:44
【问题描述】:

使用 JPA,我有一个来自我的数据库的条目列表:

User(id, firstname, lastname, email)

我做得到:

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

我想通过这样的方式在一个请求中更新所有内容:

"UPDATE USER SET email = null IN :list"

然后将参数“list”设置为users

有可能吗?如果有,怎么做?

感谢您的帮助:)

【问题讨论】:

    标签: jpa playframework


    【解决方案1】:

    好吧,您可以将用于获取列表的查询嵌入到更新的 where 子句中。

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

    通过这样做,您将执行查询以搜索列表并在单个更新查询中进行更新。

    你觉得怎么样?你认为这可行吗?

    -编辑-

    由于您想使用原始项目列表而不是刚刚从数据库中检索到的列表,您仍然可以确保像这样构建原始列表

    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。

    【讨论】:

    • 问题是我检索的用户列表会随着时间而变化,我担心更新会影响这些变化。我想为当前选定的用户保留更新。
    • @cx42net 您仍然可以使用原始列表作为查询的参数。我已经更新了这篇文章,展示了一个我认为可以做到的例子。
    • 像魅力一样工作!完美的!我开始以同样的方式使用String[],但IN(:list) 不起作用,我不得不使用join(",", names),这一点也不漂亮!你的解决方案更好!谢谢!
    • 但我在想,我对您的代码进行了更改,因为WHERE lastname IN (:originalList) 将导致WHERE lastname IN("smith", "smith", "smith")。更新真正使用了ID:WHERE id IN (:originalList),列表是一个简单的List&lt;Long&gt;收集的id。
    • @cx42net d(^_^)b 这就是为什么我说 where 过滤器应该使用候选键,比如 ID。
    【解决方案2】:

    如果你有 jpa+hibernate,你可以使用 entityManager.createQuery() 来创建 hql 查询 像这样:

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

    【讨论】:

    • 好吧我终于测试了,还是不行。列表“名称”是供应商实例列表,而不是字符串列表。基于此,请求失败,因为它需要一个字符串列表而不是供应商列表。
    • 此外,如果使用 JPA,则 em.createQuery 用于 JPQL 而不是 HQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2021-06-03
    • 2020-03-26
    • 2016-09-20
    • 1970-01-01
    • 2016-05-05
    • 2020-03-13
    相关资源
    最近更新 更多