2014-11-07 62 views
0

我有兩個實體,ShoppingCart和ShoppingCartLine。 ShoppingCart有一系列ShoppingCartLines。我正在嘗試使用條件創建一個JPA查詢,以獲取ShoppingCart ID的列表以及每個ShoppingCart所具有的ShoppingCartLines的數量。JPA 2標準 - group by和count

這是在我的購物類別的映射:

@OneToMany(mappedBy = "shoppingCart", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true) 
private Set<ShoppingCartLine> shoppingCartLines = new TreeSet<ShoppingCartLine>(); 

這裏是我的嘗試與創建我的JPA查詢代碼:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Tuple> cq = cb.createTupleQuery(); 
Root<ShoppingCart> carts = cq.from(ShoppingCart.class); 
Join<ShoppingCart, ShoppingCartLine> lines = carts.join("shoppingCartLines", JoinType.LEFT); 
cq.multiselect(carts.<Long>get("id"), cb.count(lines)); 
cq.groupBy(carts.<Long>get("id")); 

Query tq = em.createQuery(cq); 
return tq.getResultList(); 

當我運行此我得到一個SQLGrammerException,生成的SQL對我來說看起來不正確。

select 
    shoppingca0_.id as col_0_0_, 
    count(.) as col_1_0_ 
from 
    SHOPPINGCART shoppingca0_ 
left outer join 
    SHOPPINGCARTLINE shoppingca1_ 
     on shoppingca0_.id=shoppingca1_.shoppingCart_id, 
    SHOPPINGCARTLINE shoppingca2_ 
where 
    shoppingca0_.id=shoppingca2_.shoppingCart_id 
group by 
    shoppingca0_.id 

我要提到我使用Hibernate 3.5.4與MySQL5Dialect

這是我想生成查詢:

select 
    sc.id, 
    count(scl.id) 
from 
    shoppingcart sc 
left join 
    shoppingcartline scl 
on 
    scl.shoppingCart_id = sc.id 
group by 
    sc.id 

任何想法,我做錯了嗎?謝謝。

+0

你實際使用Hibernate?如果是這樣,你應該使用Hibernate Criteria。 – JamesENL 2014-11-07 03:40:04

+1

我爲什麼要那樣做?我們使用JPA的原因是如果需要的話,可以更改我們的ORM。 – Jason 2014-11-07 14:53:52

回答

0

嘗試更換連接和多選線,

SetJoin<ShoppingCart, ShoppingCartLine> lines = 
    carts.joinSet("shoppingCartLines", JoinType.LEFT); 
cq.multiselect(carts.<Long>get("id"), cb.count(lines.<Long>get("id")));