2015-05-08 53 views
2

我想選擇計數,以製造類似的JPA提供此用「其中」使用CriteriaBuilder

SELECT COUNT(*) FROM Tickets WHERE ticketStatus = 3 AND ... 

但只使用CriteriaBuilder。下面是我得到了什麼:

private class Criteria { 
    CriteriaBuilder builder; 
    CriteriaQuery<TicketModel> query; 
    Root<TicketModel> root; 

    public Criteria() { 
     builder = em.getCriteriaBuilder(); 
     query = builder.createQuery(TicketModel.class); 
     root = query.from(TicketModel.class); 
    } 
} 
public long getSearchResultsQuantity(SearchModel search) { 
    Criteria c = new Criteria(); 
    List<Predicate> params = new ArrayList<Predicate>(); 

    if (search.getStartDate() != null && search.getEndDate() != null) { 
     params.add(c.builder.between(c.root.get(TicketModel_.ticketDate), search.getStartDate(), 
       search.getEndDate())); 
    } 

    if (search.getStatus() != -1) { 
     params.add(c.builder.equal(c.root.get(TicketModel_.ticketStatus), search.getStatus())); 
    } 

    CriteriaQuery<Long> q = c.builder.createQuery(Long.class); 

    return em.createQuery(
      q.select(c.builder.count(q.from(TicketModel.class))).where(params.toArray(new Predicate[] {}))) 
      .getSingleResult(); 
} 

然而,當我嘗試我收到這樣的異常來執行此查詢:

org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.ticketStatus' [select count(generatedAlias0) from com.mif.spring.models.TicketModel as generatedAlias0 where generatedAlias1.ticketStatus=0] 

我在春天有點nooby,所以任何幫助將是非常感激!

+0

'TicketModel_'來自哪個params?它不應該是'TicketModel' – jny

+0

由於問題與Spring無關,我刪除了標籤。 – dunni

回答

1

問題是你在混合根。

如果爲兩個根創建相同的別名將工作。

例如:

private class Criteria { 
    CriteriaBuilder builder; 
    CriteriaQuery<TicketModel> query; 
    Root<TicketModel> root; 


    public Criteria(String alias) { 
     builder = em.getCriteriaBuilder(); 
     query = builder.createQuery(TicketModel.class); 
     root = query.from(TicketModel.class); 
     root.alias(alias); 
    } 
} 

然後

Criteria c = new Criteria("someAlias"); 
... 
CriteriaQuery<Long> q = c.builder.createQuery(Long.class); 
Root<TicketModel> root = q.from(TicketModel.class); 
root.alias("someAlias"); 

return em.createQuery(
     q.select(c.builder.count(root)).where(
params.toArray(new Predicate[] {}))) 
       .getSingleResult(); 

也許你可能會感興趣的類JpaUtils(我寫的),您可以簡單地這樣做:

Long count = JpaUtils.count(em, criteria);

用於從任何標準查詢中獲取計數。

+0

謝謝!你的解決方案爲我工作。我也看過你的JpaUtils - 偉大的工作 - 我應該有一天可以使用它! –