【问题标题】:efficient JPQL: update entities in @onetomany高效的 JPQL:更新 @onetomany 中的实体
【发布时间】:2012-09-01 06:53:31
【问题描述】:

我有两个实体 Customer 和 Order(不包括琐碎的 setter 和 getter)

@Entity
public class Customer {

    @GeneratedValue
    @Id
    private int id;

    @OneToMany
    List<Order> orderList;


}

@Entity
public class Order {

    @GeneratedValue
    @Id
    private int id;

    @ManyToOne
    Customer customer;

    private boolean paid;

    public Order(Customer customer) {

        this.customer = customer;
        customer.getOrderList().add(this)
    }   
}

现在我想为给定客户的所有订单设置“paid = true” 下面的查询似乎可以解决问题,但我觉得它效率低下,而且我将反向关系存储在 Customer.orderList 中的事实暗示应该有其他方法可以做到这一点。

UPDATE Order o SET o.paid = true WHERE EXISTS 
(SELECT c.orderList FROM Customer c WHERE o MEMBER OF c.orderList AND c = :customer)

我正在使用容器管理事务、glassfish 和 javaDb。但我更希望可以在 JPA/JPQL 域中进行改进,而不是特定于容器或数据库。

【问题讨论】:

    标签: jpa eclipselink jpql


    【解决方案1】:

    private id; ??遗漏字段类型

    添加@OneToMany注解,cascade = CascadeType.All

    Customer entity = entityManager.find(Customer.class, id)   
    for (Order order : entity.getOrderList())  
    {
       order.setPaid(true);  
    }  
    

    如果您使用的是cantainer managed transaction,那么true 将被保存到数据库中

    【讨论】:

    • 我考虑过这个选项,但我认为使用 jpql 进行批量更新会更快,因为它不必构造 java 实体。
    • 数据库中的“付费”字段是什么类型?
    • 不做任何基准测试,我认为你的答案是提高性能。我只是想如果可以使用批量更新,它会做得更好
    • 在这两种方法中,一个查询将被发送到数据库。我没有看到显着的差异
    猜你喜欢
    • 2015-11-07
    • 2015-01-07
    • 2016-07-26
    • 2019-04-26
    • 2020-04-19
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多