在我们普通的查询中, 一般是model中有多少个字段,对应查询出来的记录是有多少个列,hibernate会自动帮我们把这些字段和列的值对应上, 但是我现在用到了聚合函数, 比如说我求和sum(amount), 那么我除了讲所有的列查询出来,还多出来一个求和函数的列, 那这样如何讲这一个列的值封装起来呢?

解决方案 »

  1.   

    我觉得应该只能用SQL而不是HQL了。
    SQLQuery试试
    hibernateTemplater.execute(...);
    sess.createSQLQuery("SELECT * FROM CATS").list();
      

  2.   


    其实查询语句我已经是实现了的,和sql和hql无关, 都可以查询出来。 只是查询出来的结果集没发用泛型封装。
      

  3.   


    我把代码贴出来讨论一下吧。  
    DetachedCriteria criteria = DetachedCriteria.forClass(ChargeRecord.class).addOrder(Order.desc("sucTime"));
    this.addCondition(chargeBean, criteria);
    List<ChargeRecord> charges = hibernateTemplate.findByCriteria(criteria, page.getBeginResult(), page.getSize());这里是我查询的方法。查询的条件都封装在criteria中。然后在具体实现条件封装在addCondition()里。chargeBean是一个值对象。
     //匹配订单号查询条件
    if(!StringUtils.isBlank(chargeBean.getCharge().getId())){
        criteria.add(Restrictions.eq("id", chargeBean.getCharge().getId()));
    }
    //匹配搜索日期查询条件
    if(!StringUtils.isBlank(chargeBean.getBeginTime())){
        criteria.add(Restrictions.ge("time", Long.valueOf(chargeBean.getBeginTime())));
    }
    if(!StringUtils.isBlank(chargeBean.getEndTime())){
        criteria.add(Restrictions.le("time", Long.valueOf(chargeBean.getEndTime())));
    }
    以上这些只是一般的查询条件匹配, 返回值用实体类来接受没有问题。关键在下面。
    if(chargeBean.getMinTotalAmount() != null){
        criteria.setProjection(Projections.alias(Projections.sum("amount"), "totalAmount"));
        DetachedCriteria cri = DetachedCriteria.forClass(ChargeRecord.class).createAlias("user", "u")
          .setProjection(Projections.projectionList().add(Projections.sum("amount"), "totalAmount")
          .add(Projections.groupProperty("u.id")));
        criteria.add(Subqueries.le(chargeBean.getMinTotalAmount(), cri))
         .addOrder(Order.desc("totalAmount"));
    }
    我在这里,对充值金额字段进行求和统计时, 这个字段就无法封装在model中了。
      

  4.   

    顺序求高手解答, 一般用用hibernate查询, 是自己写hql多呢,还是用hibernate帮封装好的一些查询方法查询。 我之前一直都是习惯使用findByCriteria()这个方法。 这个方法很强大, 投影,聚合都可以使用。但是今天碰到这个问题, 让我深深感受到人家封装的东西, 还是不如自己写的原生态sql舒服啊。但是这又有一个问题,如果查询条件非常多, 那代码量岂不是相当恐怖。
      

  5.   

    我一般是这么处理的  返回一个List 然后对这个List循环 用一个Object数组接收 再依次放入到对象中
    之前要现在model中创建你的变量Query query = this.getListQuery(goods, "select g,gt.typename,gt.feature from Goods g,Goodstype gt where g.typeid=gt.id");List list = query.list();

      for(int i = 0  ; i < list.size() ; i++){


    Object[] objs = (Object[]) list.get(i);

    Goods newGoods = (Goods) objs[0];
    newGoods.setType(objs[1].toString());
    newGoods.setFeature(objs[2] != null ? objs[2].toString() : "");

    list.set(i, newGoods);
    }
      

  6.   

    在hibernate里配置类似如下:<property generated="insert" name="sumScore" formula="(select sum(u.uScore) from users u where u.uId = uid)"/>实体类里必须有sumScore字段   数据库里不需要有
      

  7.   

    个人感觉你这么做的意义不是很大。
    既然你可以用聚合函数把和(sum)取到,就可以在逻辑中把sum设置到相应的类的属性中setSum(int sum)。
      

  8.   

    hibernate封装的查询一般会按照hibernate的规则优化下了的。
    如果你感觉你写的sql是最优化的可以自己写了。
    至于一些非常简单的sql还是自己写sql比较好,速度会快点。毕竟HQL是封装过的。
      

  9.   

    这样查询数来的结果是个Object类型的,不可能封装到实体的属性当中的,你方法返回值类型写成Object就可以了
      

  10.   

    这个好弄啊,假如以前实体里面有abc。查出的list里面有a,b,c,
    现在在在实体里面加一个d,set(d)=get(a)+get(b)+get(c),然后把abcd弄成一个新的list,将list中的a,b,c,d数字显示 
      

  11.   

     +1 
    sumScore 可以不用存储数据库