2014-11-05 144 views
0

我有一个SQL查询是这样的。如何在Hibernate中使用Having和group by子句?

SELECT VERSION_ID FROM VIEWTEST 
where (item_id='I001' and value ='V001') 
or (item_id='I002' and value ='V002') 
or (item_id= 'I003'and value ='V003') 
group by VERSION_ID 
having count(1) = 3 

我的ViewTest实体是这样的。

@Column(name = "version_id") 
    private String versionId; 

@Column(name = "item_id") 
    private String itemId; 

@Column(name = "value") 
    private String value; 

这是我写的Crieteria查询。

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder(); 
     CriteriaQuery<String> query = criteriaBuilder.createQuery(String.class); 
     Root<ViewTest> testRoot = query.from(ViewTest.class); 
     List<Predicate> predicates = new ArrayList<Predicate>(); 
     Predicate p1 = criteriaBuilder.equal(testRoot.get("itemId"), "I001"); 
     Predicate p2 = criteriaBuilder.equal(testRoot.get("itemId"), "I002"); 
     Predicate p3 = criteriaBuilder.equal(testRoot.get("itemId"), "I003"); 

     Predicate v1 = criteriaBuilder.equal(testRoot.get("value"), "V001"); 
     Predicate v2 = criteriaBuilder.equal(testRoot.get("value"), "V002"); 
     Predicate v3 = criteriaBuilder.equal(testRoot.get("value"), "V003"); 
     predicates.add(criteriaBuilder.and(p1 , v1)); 
     predicates.add(criteriaBuilder.and(p2 , v2)); 
     predicates.add(criteriaBuilder.and(p3 , v3)); 

现在我不知道如何添加组的By和Having子句到这个标准。

有人可以帮我吗?

找到了一个更好的方法来做到这一点。

刚刚添加到我的代码。

query.groupBy(testRoot.<String> get("versionId")); 
query.having(criteriaBuilder.in(criteriaBuilder.count(testRoot.get("versionId"))).value(
     queryCount)); 

这没有把戏。

回答

0

你看过预测吗? Hibernate developer guide: Projections

实施例:

List results = session.createCriteria(Cat.class) 
.setProjection(Projections.projectionList() 
    .add(Projections.rowCount()) 
    .add(Projections.avg("weight")) 
    .add(Projections.max("weight")) 
    .add(Projections.groupProperty("color")) 
) 
.list();