Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA OneToMany关系与绩效_Jpa_Join_Relational Database_Lazy Evaluation - Fatal编程技术网

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