2013-10-31 1 views
1

비교적 간단한 쿼리가 필요하지만 JPA는 그것을 만드는 것이 어렵습니다.JPA Select Count Distinct

는 SQL의 변형은 다음과 같이 보일 것이다 :

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

[편집 : OrderID를 기본 키가 아닙니다. 더 많은 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을 :

이것은 내가 지금까지 가지고 무엇인가? "선택 주문 (o.orderID) 주문 o 어디 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'계정에 있습니까? 나는 그것이 바보 같은 이름이라는 것을 알고 있지만 비슷한 'OrderId'를 가진 'Order'에 더 많은 필드가있을 수 있습니다. 나는 카운트가 너무 높게 끝날 것 같아? – RobAu

+0

'OrderId'가'Order' 테이블의 기본 키인 경우 결과 SQL 쿼리가 해당 필드를 정확하게 가져옵니다. 그래서 : OrderId가 테이블의 기본 키입니까? 물론 원할 경우 생성/실행 된 쿼리 (JPA 공급자의 로깅을 전환하거나 DB 수준의 로깅을 확인)를 확인할 수 있습니다. –

+0

그렇지 않습니다. 실제 코드를 게시 할 수 없기 때문에이 예제 코드를 만들었습니다. 이 테이블은 하나 이상의 'OrderId'가있을 수있는 'OrderMutation'과 비슷합니다. – RobAu