题目虽说是计算乘法,但是能代表一类应用,就是Criteria执行一般sql的功能。
hql与QBC的一些查询操作
1:QBC做比较常见的统计操作,两列相乘,再计算和
因为最近一段时间在用hibernate做些东西,而且对sql不感兴趣,所以想用hql,qbc完成数据统计的操作(当然,数据统计也可以再逻辑层完成,但是那样就显得效率不高。。。)况且也在学习阶段,所以还是多看看多学学。
首先是QBC,看了QBC的Restrictions和Projections,花了两天时间,一直没有找到如何处理两列相乘的方法,后来看到Projections.sqlProjection(),似乎可以用,但是在网上基本没什么资料。最后有幸在Hibernate官方论坛,搜索出一个结果。其实使用后发现也是很方便的。
Criteria cq = s.createCriteria(IO.class);
ProjectionList pl = Projections.projectionList();
String[]col = {“q”};
Type[]t = {new DoubleType()};
pl.add(Projections.sqlProjection(“sum(quantity*price) as q”, col, t));
cq.setProjection(pl);
List results = cq.list();
sqlProjection()有三个参数,第一个参数是要做的一些操作,应该是选择操作,也可以是类似sum,avg等操作,第二个参数是需要引用的别名列表(具体没有完全试过,应该是前面第一个参数操作中产生的别名,具体慢慢使用后,再完善),第三个就是第二个参数中别名所指向的对象的类型。
我这里查询了quantity列和price列相乘的操作,并且把结果列命名别名为q,这样,在第二个参数别名数组中指明别名,第三个类型数组中,设置第二个参数中别名数组的指向的对象的类型(这里是double类型)。
接着在Criteria 里setProjection(),然后就可以查询了。
2:hql做以上的操作:
其次是使用hql,一开始认为用hql和sql类似,应该比较容做出来,但是事实上。。。
首先,可以用hql做两列相乘,这个比较简单:
String hql = “select o.quantity*o.price as a from IO o”;
Query q = s.createQuery(hql);
List li = q.list();
本来以为,可以做以上查询的话,直接把以上查询作为一个子查询就可以了,比如:
select sum(a) from select o.quantity*o.price as a from IO o
但是但是事实上,这样是错误的,开始一直没注意,在hql中,from的字句是不支持子查询的。。
不过,通过查询资料,发现hql有个更方便的方式(不过也可能sql中也是可以用,只是我已经忘记了),在这个操作中,可以不用子查询,直接用如下:
select sum(o.quantity*o.price) as a from IO o
确实是没有想到,只是在hibernate文档中也没有这样的例子,只是说hql是支持一些普通的算法操作的,于是就成功了。
接下来,估计还是得看下hql和sql的了。