我有两个实体:父Customer
和子Order
例如,每个Customer
都有1,000,000 Orders
,因此在任何给定时间内都不需要加载Customer
所有Orders
,但我希望有这种能力来加入在JPA中查询这两个实体
因此,我必须创建@OneToMany
关系来进行连接查询。
我的问题是:如何在不进行joinColumn
的情况下获取查询,因为即使在懒惰模式下也可以加载1,000,000个对象!
我只是想在这些对象上查询本地连接等限制。
答案 0 :(得分:3)
如果您不希望在@OneToMany
课程中隐式设置Customer
关系而不是您必须的关系。您可以在没有标记关系的情况下执行JPQL查询(以非常精确的方式)。
假设你有:
@Entity
public class Customer {
// all Customer-related fields WITHOUT @OneToMany relationship with Order
}
@Entity
public class Order {
@ManyToOne
private Customer owner;
}
然后,如果你想获得特定Orders
的所有Customer
,你可以执行一个简单的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
订单时,才能执行代码。
我希望我能正确理解你的问题。
答案 1 :(得分: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