【问题标题】:JPA OneToMany relations and performaceJPA 一对多关系和性能
【发布时间】:2011-11-29 08:03:07
【问题描述】:

我有两个实体:父 Customer 和子 Order
例如,每个Customer 有 1,000,000 个Orders,因此在任何给定时间都不需要加载带有所有OrdersCustomer,但我希望能够在JPA 中对这两个实体进行连接查询。
因此,我必须创建@OneToMany 关系来进行连接查询。

我的问题是:如何在不创建 joinColumn 的情况下获取查询,因为即使在惰性模式下也可以加载 1,000,000 个对象!
我只想通过本地连接等限制条件查询这些对象。

【问题讨论】:

    标签: jpa join relational-database lazy-evaluation


    【解决方案1】:

    如果您不想在 Customer 类中隐式设置 @OneToMany 关系,则不必这样做。您可以在没有标记关系的情况下执行 JPQL 查询(以非常精确的方式)。

    假设你有:

    @Entity
    public class Customer {
    
        // all Customer-related fields WITHOUT @OneToMany relationship with Order
    }
    
    @Entity
    public class Order {
    
        @ManyToOne
        private Customer owner;
    }
    

    然后,如果您想获取特定 Customer 的所有 Orders,您可以执行一个简单的 JPQL 查询,如下所示:

    // Customer customer = ...
    // EntityManager em = ...
    
    String jpql = "SELECT o FROM Order o WHERE o.owner = :customer";
    
    TypedQuery<Order> query = em.createQuery(jpql, Order.class);
    query.setParameter("customer", customer);
    
    List<Order> orders = query.getResultList();
    

    通过这种方式,您只有在确定要获取Customer's 订单时才能执行代码。

    希望我正确理解了您的问题。

    【讨论】:

    • thnx,很好的答案,但我希望 OneToMany 上有一个限制注释用于默认获取,你怎么看?,因为例如我希望我的客户实体有前 10 个订单可以通过"customer.orders" ,但是现在,如果我放 OnetoMany 可以加载所有 1000000 条记录
    • 所以您想要一个注释/配置,它可以让您说出要获取多少“太多”结果?我想这样的功能将是 高度 特定于供应商的,因为 JPA 规范甚至不要求提供者尊重延迟加载。在您的情况下,我会使用精心放置的 JOIN。
    • 在上面的例子中,是否可以运行一个查询,例如根据订单表的条件从客户表中检索数据?例如,我可以说给我所有下单 > 50 英镑的客户吗?
    • 当然,只需将AND o.value &gt; 50 添加到 JPQL 查询的过滤器部分即可。
    【解决方案2】:

    EclipseLink 支持 QueryKeys,它允许您定义未映射的查询字段或关系。目前没有对查询键的注释支持,但您可以使用 API 和 DescriptorCustomizer 定义它们。

    另外你不需要OneToMany来查询它,只需使用逆ManyToOne来查询,

    Select distinct c from Customer c, Order o where o.customer = c and o.item = :item
    

    或者,

    Select distinct o.customer from Order o join o.customer c where o.customer = c and o.item = :item
    

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 2014-04-08
      相关资源
      最近更新 更多