2013-07-10 23 views
0

假設我有三個實體:Customer,Product和Order。每個訂單都有一個與客戶的ManyToOne關聯和一個與產品的ManyToOne關聯。關聯從訂單到客戶和產品分別是單向的。所以數據庫看起來像:JPA NamedQuery獲取引用對象而不執行連接

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

您所查詢的是正確的,你只需要東西來獲得不同的客戶,因爲同一產品的客戶可能已經訂購了不止一次

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

獲得客戶:

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

我不僅可以用'選擇o.customer',但我也可以使用WHERE o.product =:product'。確實,使用'o.productId'給了我一個像'無法識別的字段'的錯誤。我不得不說我的實體比例子要複雜一點。更確切地說,我使用嵌入在實體中的組合ID(和'Serializable'實體)。我不知道這是否與找到的解決方案有一些關係。 – user1781028