0

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

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"
)

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

4

2 回答 2

0

避免 JOIN 的良好做法是使用存在(参见 oracle 文档: http ://docs.oracle.com/html/E24396_01/ejb3_langref.html#ejb3_langref_exists ),大多数数据库与 JOIN 相比优化了 EXISTS。

于 2013-07-10T08:22:57.603 回答
0

您的查询是正确的,并且您只需要获得不同的客户,因为同一个产品客户可能不止一次订购

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

获取客户:

    Query qry = em.createNamedQuery("GetCustomersByProduct");
    List<Customer> resultList = qry.getResultList();
于 2013-07-10T08:27:42.380 回答