假设我有三个实体:客户,产品和订单。每个订单都有一个与客户的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"
)
或者是否有必要执行加入?最好的方法是什么?
答案 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();