【问题标题】:JPA add element to collection using CriteriaUpdateJPA 使用 CriteriaUpdate 将元素添加到集合
【发布时间】:2016-02-27 12:20:03
【问题描述】:

我在 Hibernate (5.1) 上,我需要将一个元素添加到所有符合条件的实体的集合字段中,而不需要全部获取。

@Entity
public class Order {

    @Id
    public Long id;

    public Date placedOn;

    @ManyToMany
    public List<Item> items;

}

我需要将新Item 的相同实例添加到某个日期之后放置的所有Orders。我需要使用 Criteria API,而不是 JPQL。

这可能吗?我找不到这方面的文档。

附: order/items 案例只是一个示例,我正在寻找一种通用方法,我还需要对其进行调整以从集合中删除项目。

【问题讨论】:

    标签: java hibernate jpa criteria-api


    【解决方案1】:

    您无法使用 CriteriaUpdate 执行此操作,因为它不是更新,而是许多插入,因为您有一个多对多关系,该关系在数据库中的关系表上中继。

    因此您必须查询所有订单,然后添加将生成插入语句的项目。

    【讨论】:

    • 我害怕那个。我知道这不是 SQL UPDATE,但我认为 JPA 有某种 JPQL UPDATE Order o INSERT :item INTO o.items 及其相关的 Criteria 方法。因为在他们的底层 JPA 实现中,在更新集合字段时会执行这些 INSERTs,我希望他们还提供让用户以编程方式执行此类操作的方法……
    • 不,它不能那样做。因为你不能在一个 SQL 语句中做到这一点。
    • JPA 没有魔法,它只是有另一种查询语言,最后会转换为 SQL
    • 谢谢@simas_ch,我明白了。由于我需要更新许多彼此非常不同的实体类中的集合,因此我正在尝试使用&lt;X&gt; addTo(String propertyName, X item) 方法构建一个抽象DAO&lt;E&gt;,但是如果JPA 或Hibernate 提供了一种抽象方法来执行此操作,我将不得不采用反射路径(希望它适用于代理实体更新)。
    • 我会使用 SQL 来执行此操作,因为它会快得多。您无需阅读所有订单即可添加商品。
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2019-09-21
    • 2011-06-03
    • 2020-06-07
    相关资源
    最近更新 更多