JPA OneToMany关系与绩效
我有两个实体:父JPA OneToMany关系与绩效,jpa,join,relational-database,lazy-evaluation,Jpa,Join,Relational Database,Lazy Evaluation,我有两个实体:父客户和子订单 例如,每个客户都有1000000个订单,因此在任何给定时间内都不需要加载一个包含所有订单的客户,但我希望能够在JPA中对这两个实体进行联接查询。 因此,我必须创建@OneToMany关系来进行连接查询 我的问题是:如何在不进行joinColumn的情况下获取查询,因为即使在惰性模式下,也可能加载1000000个对象 我只想查询这些对象的where限制,比如native join。如果您不想在Customer类中隐式设置@OneToMany关系,那么就不必这样做。您可
客户
和子订单
例如,每个
客户
都有1000000个订单
,因此在任何给定时间内都不需要加载一个包含所有订单的客户
,但我希望能够在JPA中对这两个实体进行联接查询。
因此,我必须创建@OneToMany
关系来进行连接查询
我的问题是:如何在不进行joinColumn
的情况下获取查询,因为即使在惰性模式下,也可能加载1000000个对象
我只想查询这些对象的where限制,比如native join。如果您不想在Customer
类中隐式设置@OneToMany
关系,那么就不必这样做。您可以执行JPQL查询(以非常精确的方式),而无需标记关系
假设您有:
@Entity
public class Customer {
// all Customer-related fields WITHOUT @OneToMany relationship with Order
}
@Entity
public class Order {
@ManyToOne
private Customer owner;
}
然后,如果您想获取特定客户的所有订单
,您可以执行如下简单的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();
//客户=。。。
//EntityManager em=。。。
String jpql=“从订单o中选择o,其中o.owner=:customer”;
TypedQuery=em.createQuery(jpql,Order.class);
query.setParameter(“客户”,客户);
List orders=query.getResultList();
这样,只有当您确实确定要获取客户的
订单时,才能执行代码
我希望我正确地理解了您的问题。EclipseLink支持QueryKeys,允许您定义未映射的查询字段或关系。目前没有对查询键的注释支持,但是您可以使用API和描述符编辑器来定义它们 您也不需要使用OneToMany进行查询,只需使用反向ManyToMany进行查询 i、 e 或者
thnx,回答很好,但我希望OneToMany上有一个默认抓取的限制注释,你怎么看?因为例如,我希望我的客户实体有前10个可通过“Customer.orders”访问的订单,但现在,如果我放一个omany,就可以加载所有1000000条记录。您需要一个注释/配置,它可以让您说出“太多”的结果有多少是无法提取的?我猜这样的特性将是高度特定于供应商的,因为JPA规范甚至不要求提供者尊重延迟加载。在上面的示例中,是否可以运行一个查询,例如根据订单表的条件从客户表检索数据?例如,我可以说给我所有下了>50英镑订单的客户吗?当然,只需将
和o.value>50
添加到JPQL查询的筛选部分。
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