2013-10-31 280 views
1

我需要一個相對簡單的查詢,但JPA使它很難創建它。JPA Select Count Distinct

的SQL變種是這樣的:

SELECT COUNT(DISTINCT OrderID) AS DistinctOrders FROM Orders WHERE CustomerID=7; 

[編輯:訂單是不是主鍵。可以有更多的OrderId在表中是相等的]

我需要設置CustomerID與傳遞給我的方法的變量。

我發現有關CriteriaQuerydistinct()的文檔,但我似乎無法將它們全部包裝在一起。

這是我到目前爲止有:

CriteriaBuilder cb = this.em.getCriteriaBuilder(); 
CriteriaQuery<Order> c = cb.createQuery(Order.class); 
Root<Order> order = c.from(Order.class); 
Path<String> customerID = order.get("customerID"); 
c.where(cb.equal(customerID, theId)); 
+1

JPQL? 「SELECT COUNT(o.orderID)FROM訂單o WHERE o.customerID =:customerID GROUP BY o.orderID」 –

回答

6
CriteriaBuilder cb = this.em.getCriteriaBuilder(); 
CriteriaQuery<Long> c = builder.createQuery(Long.class);//the query returns a long, and not Orders 
Root<Order> order = c.from(Order.class); 
//c.select(cb.countDistinct(order));//and this is the code you were looking for 
c.select(cb.countDistinct(order.get("orderID")));//for counting distinct fields other than the primary key 
Path<String> customerID = order.get("customerID"); 
c.where(cb.equal(customerID, theId)); 
+0

這是如何考慮'OrderId'的?我知道這是一個愚蠢的名字,但可能有更多的字段在'Order'中有一個類似的'OrderId'。我認爲伯爵現在會過高? – RobAu

+0

如果'OrderId'是'Order'表中的主鍵,那麼生成的SQL查詢將完全採用該字段。那麼:OrderId是表中的主鍵?當然,如果你想要的話,你可以檢查生成/執行的查詢(打開JPA提供程序中的日誌記錄或檢查數據庫級別的日誌記錄)。 –

+0

它不是。我創建了這個示例代碼,因爲我不能發佈真實的代碼。該表更像'OrderMutation',其中可以有多個'OrderId' – RobAu