如何在hibernate中使用Having和group By子句?

时间:2014-11-05 20:26:04

标签: mysql sql hibernate criteria

我有一个sql Query就是这样的。

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));

现在我不知道如何为此标准添加group By和Having子句。

有人可以帮帮我吗?

找到了更好的方法。

刚刚在我的代码中添加了以下内容。

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

这就是诀窍。

1 个答案:

答案 0 :(得分: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();