2012-07-05 54 views
0

我想實現一個包含分頁的表組件。在該表的結果是通過多選的查詢檢索到的是這樣的: JPA標準:從多選查詢中計數

SELECT DISTINCT t0.userId, 
      t0.userName, 
      t1.rolleName 
FROM userTable t0 
LEFT OUTER JOIN roleTable t1 ON t0.userId = t1.fkUser 
WHERE(t0.userType = 'normalUser' AND t1.roleType = 'loginRole') 

這個結果我可以通過一個多選查詢得到。

現在要分頁,我必須首先檢索總行數。 有沒有人可以爲這個sql定義一個criteriaquery?我失敗了,因爲一個子查詢不支持多重選擇,我不知道如何將這個不同的語句放到一個count語句中。

SELECT COUNT(*) FROM 
(
    SELECT DISTINCT t0.userId, 
        t0.userName, 
        t1.rolleName 
    FROM userTable t0 
    LEFT OUTER JOIN roleTable t1 ON t0.userId = t1.fkUser 
    WHERE(t0.userType = 'normalUser' AND t1.roleType = 'loginRole') 
) 

SELECT COUNT(DISTINCT t0.userId || t0.userName || t1.rolleName) 
FROM userTable t0 
LEFT OUTER JOIN roleTable t1 ON t0.userId = t1.fkUser 
WHERE(t0.userType = 'normalUser' AND t1.roleType = 'loginRole') 

提前感謝!

Btw。我使用的OpenJPA對WebSphere應用服務器

+0

這不是一個標準API的問題。我正在刪除該標籤。它看起來像原生SQL,不是嗎? – carbontax 2012-07-08 01:25:38

+0

@carbontax感謝您閱讀我的問題,但是如果您仔細閱讀,可以意識到我要求對這些原生SQL之一進行條件查詢。所以criteriaApi標籤是正確的。 – 2012-07-09 06:00:41

+0

JPQL'SELECT COUNT(DISTINCT CONCAT(t0.userId,t0.userName,t1.rolleName)FROM User t0 LEFT OUTER JOIN t0.roles t1 WHERE(t0.userType ='normalUser'AND t1.roleType ='loginRole ')'? – 2013-03-03 16:13:00

回答

0

以下是未經測試,但應該工作:

CriteriaBuilder builder = em.getCriteriaBuilder(); 
CriteriaQuery<Long> query = builder.createQuery(Long.class); 
Root<User> t0 = query.from(User.class); 
Join<User, Role> t1 = t0.join("roles", JoinType.LEFT); 
query.select(builder.concat(t0.get(User_.userId), builder.concat(t0.get(User_.userName), t1.get(Role_.rolleName))).distinct(true); 
query.where(cb.equal(t0.get("userType"), "normalUser"), cb.equal(t1.get("roleType"), "loginRole")); 
TypedQuery<Long> tq = em.createQuery(query); 
+1

由於Hibernate的bug(https://hibernate.atlassian.net/browse/HHH-9182),這不起作用。我發現我的解決方案是這樣做的(基本上相同,但只適用於1表):http://stackoverflow.com/a/25549631/1776630 – lopezvit 2016-08-26 10:48:55