2014-09-25 41 views
1

我試圖讓特定組的用戶數,我已經做了以下內容:意外的交叉連接生成的SQL使用的EntityManager和Hibernate

CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<Long> q = cb.createQuery(Long.class); 
     q.select(cb.count(q.from(User.class))).where(cb.equal(q.from(User.class).get("userGroup"), groupId)); 

但是,相反的在得到用戶的數量一組,我得到這個數字乘以我的表中的所有用戶的數量,產生的ORM請求如下所示:

Hibernate: select count(*) as col_0_0_ from app_user user0_ cross join app_user user1_ where user1_.user_group=1 

編輯:

這是我的用戶模型:

public class User { 
    private String userFirstName; 
    private String userLastName; 
    /* some stuff */ 
    @ManyToOne 
    private Group userGroup; 
    } 

我的組模型具有@Id和名爲id註解一個int屬性。在這種情況下,如何通過組ID分配用戶的數量?

回答

4

這是預期的行爲。 CriteriaQuery是可變的,每次調用from()時,它

創建並添加了對應於特定實體的查詢根,形成與任何現有的根笛卡爾積。 (Java EE的的Javadoc中)

達到他們預期的效果,請一次創建Root並使用參考。

CriteriaQuery<Long> q = cb.createQuery(Long.class); 
Root<User> u = q.from(User.class); 
q.select(cb.count(u)).where(cb.equal(u.get("userGroup"), groupId)); 

在上面的代碼u扮演相同的角色作爲此查詢

SELECT u.name FROM User u 

進一步解釋它,調用from()兩次將相當於

SELECT u1, u2 FROM User u1, User u2 
+0

感謝您的解釋... – TheByeByeMan 2014-09-25 09:36:37