JPA NamedQuery获取引用的对象而不执行连接

时间:2013-07-10 08:08:49

标签: jpa named-query

假设我有三个实体:客户,产品和订单。每个订单都有一个与客户的ManyToOne关联和与产品的ManyToOne关联。关联从订单到客户和产品分别是单向的。所以数据库看起来像:

Customer
+----+-----+
| ID | ... |
+----+-----+

Product
+----+-----+
| ID | ... |
+----+-----+

Order
+----+-------------+------------+-----+
| ID | CUSTOMER_ID | PRODUCT_ID | ... |
+----+-------------+------------+-----+

现在我想编写一个NamedQuery来检索订购特定产品的所有客户。我是否可以在查询中引用Customer对象而无需在Customer和Order之间执行连接?我可以这样写:

@NamedQuery(
name =  "GetCustomersByProduct",
query = "SELECT o.customer"
        "FROM Order o "+
        "WHERE  o.productId = :productId"
)

或者是否有必要执行加入?最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

避免JOIN的良好做法是使用exists(参见oracle doc:http://docs.oracle.com/html/E24396_01/ejb3_langref.html#ejb3_langref_exists),大多数数据库在与JOIN进行比较时优化EXISTS。

答案 1 :(得分:0)

您的查询是正确的,只有您需要获得不同的客户,因为同一产品客户可能已订购多次

query = "SELECT distinct(o.customer)"
    "FROM Order o "+
    "WHERE  o.productId = :productId"

获取客户:

    Query qry = em.createNamedQuery("GetCustomersByProduct");
    List<Customer> resultList = qry.getResultList();