class A {
    Long id;
    List<B> bList;
}class B {
    Long id;
    A a;
}A和B为一对多关系
我需要使用criteria查询A的实例中,bList.size() > count值的对象,想问问应该怎么实现?我是这样做的,但是报错了:
Criteria c = getSession().createCriteria(A.class);
c.createAlias("bList", "b");
c.add(Restrictions.gt("count(b)"), count); // 此处有误
List list = c.list();
报错:org.hibernate.QueryException: could not resolve property: count(b)总结起来,就是如何实现需要通过统计方法,如count(*),进行筛选的criteria查询?

解决方案 »

  1.   

    不明白楼主的意思,不过获取总数的方法可以用下面程序:int size = (Integer)criteria.setProjection(Projections.count("*")).uniqueResult();
      

  2.   

    我有看了下文档。criteria好像还没有这样的功能。
    自己写循环处理吧。
      

  3.   

    int size = (Integer)criteria.setProjection(Projections.count("*")).uniqueResult();
      

  4.   

    看了大家的回复,貌似没有理解我的意思,我是需要通过count(b) > count值进行筛选,最终获取符合条件的A的对象数组,而不是一个数值,所以,做Projections映射应该是不合要求的!谢谢你们的回答,我继续等待答案!!
      

  5.   

    要不我发份文档给你看下??我大概看了下文档,没有找到相应的API。
    要不你试试这样:
    Criteria c = getSession().createCriteria(A.class); 
    c.createAlias("bList", "b"); 
    c.add(Restrictions.gt("b.size"), count); 看hibernate 能否将size这个属性映射成count;
      

  6.   


    呃,"b.size"貌似是去使用b.getSize();方法吧?b里边是没有这个属性的!!
    呵呵,看来五等的高手都不知道的答案,估计这个问题是无解了,要是到下班还没有解决办法,这分就给你了吧
      

  7.   

    我尝试过使用Restrictions.sqlRestriction()这个方法来解决,但最后还是未果,不知道大家能不能从这个思路再来想想
      

  8.   

    不要这样说,我对criteria也只有初略的了解。我觉得是在不行去查查英文API吧,不到万不得已我也不愿去看那头疼的玩意。
      

  9.   


    session.createCriteria(A.class)
      .add(Restrictions.sqlRestriction("(select count(*) from b where b.a_id = {alias}.id) > ?", count, Hibernate.INTEGER))
      .list();
    这样应该可以的
      

  10.   


    谢谢您的提示!!!我使用跟你类似的方法把问题解决了~:)
    还有谢谢longtenggdf,觉得你人挺好,级别这么高还这么谦虚,真不容易!
      

  11.   

    看来Criteria还是把这种问题交给HQL了 ~学习。