2011-03-24 50 views

回答

10

這應該做的伎倆(如果你想使用JPA標準API):

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<Long> query = cb.createQuery(Long.class); 

Root<Entity> root = query.from(Entity.class); 

//Selecting the count 
query.select(cb.count(root)); 

//Create your search criteria 
Criteria criteria = ... 

//Adding search criteria 
query.where(criteria); 

Long count = getEntityManager().createQuery(query).getSingleResult(); 

在另一方面,如果你想使用JP-QL,下面的代碼應該做的伎倆:

//Add the where condition to the end of the query 
Query query = getEntityManager().createQuery("select count(*) from Entity entity where...") 
Long count = query.getSingleResult(); 
+1

問題是,我希望得到一個子查詢返回的行數。看起來這是不可能的,因爲子查詢不能像JPA – 2011-03-28 06:58:47

+9

那樣使用這完全沒有回答具體問題。 OP詢問如何計算子查詢的結果,而不是如何計算查詢結果。 – BalusC 2012-08-22 15:29:21

22

我在這個問題上絆倒也。我最終希望執行以下JPQL:

SELECT COUNT(u) 
FROM (
    SELECT DISTINCT u 
    FROM User u 
    JOIN u.roles r 
    WHERE r.id IN (1) 
) 

但是,這是不可能的,也不符合標準API。研究表明,這只是JPA的設計限制。 JPA規範規定,子查詢只在WHEREHAVING條款支持(因而在FROM沒有)。

重寫下面的JPQL形式查詢:

SELECT COUNT(u) 
FROM User u 
WHERE u IN (
    SELECT DISTINCT u 
    FROM User u 
    JOIN u.roles r 
    WHERE r.id IN (1) 
) 

使用JPA標準API類似如下:

CriteriaQuery<Long> query = cb.createQuery(Long.class); 
Root<User> u = query.from(User.class); 
Subquery<User> subquery = query.subquery(User.class); 
Root<User> u_ = subquery.from(User.class); 
subquery.select(u_).distinct(true).where(u_.join("roles").get("id").in(Arrays.asList(1L))); 
query.select(cb.count(u)).where(cb.in(u).value(subquery)); 
Long count = entityManager.createQuery(query).getSingleResult(); 
// ... 

已經解決了這個功能要求我。這也應該讓您充分了解解決您的特定功能需求。

+0

如果要統計彙總查詢 – 2015-05-19 07:44:18

+0

的結果,你不能用這種方法@馬丁,你會從任意CriteriaQuery中建議DISTINCT COUNT什麼辦法? – svlada 2015-05-19 18:47:18

+0

@svlada,我沒有找到有效的解決方案,只返回所有行並在應用程序服務器上計數。 – 2015-05-20 09:12:24

相關問題