在我们普通的查询中, 一般是model中有多少个字段,对应查询出来的记录是有多少个列,hibernate会自动帮我们把这些字段和列的值对应上, 但是我现在用到了聚合函数, 比如说我求和sum(amount), 那么我除了讲所有的列查询出来,还多出来一个求和函数的列, 那这样如何讲这一个列的值封装起来呢?
解决方案 »
- java 读取游览器端 dll文件
- 用hidden传值问题
- Tomcat怎么把System.out.println("aaaaaaaaaaaaaaaaa");输出到日志文件里?
- 求教jdbc连接oracl的问题
- 新手上路::怎么样通过applet或者是Application调用EJB? 急
- stateless session bean究竟快在那里,散分(续)
- SQL Server 2000 JDBC驱动程序事务出错
- ***J2EE RI database Setting问题
- 下面这段C#代码转换成JAVA语言是怎样的?求大神帮助
- 请问有大神写过websocket 服务器吗。
- 学习java
- OpenCSV 解析生成.csv格式文件,如:0011,用excel打开变成了11。请各位帮忙,谢谢!
SQLQuery试试
hibernateTemplater.execute(...);
sess.createSQLQuery("SELECT * FROM CATS").list();
其实查询语句我已经是实现了的,和sql和hql无关, 都可以查询出来。 只是查询出来的结果集没发用泛型封装。
我把代码贴出来讨论一下吧。
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中了。
之前要现在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);
}
既然你可以用聚合函数把和(sum)取到,就可以在逻辑中把sum设置到相应的类的属性中setSum(int sum)。
如果你感觉你写的sql是最优化的可以自己写了。
至于一些非常简单的sql还是自己写sql比较好,速度会快点。毕竟HQL是封装过的。
现在在在实体里面加一个d,set(d)=get(a)+get(b)+get(c),然后把abcd弄成一个新的list,将list中的a,b,c,d数字显示
sumScore 可以不用存储数据库