精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-07
项目中求满足某一条件记录数是这样来的:
super.getHibernateTemplate().findByCriteria(d).size(). 有些怪.
由于对接口编程与hibernate也多少有些了解,以学习的心态首先想到的是,可能hibernate方法findByCriteria的是一List
的非ArrayList实现类,也就是hibernate自身的一个特定功能的list实现类,
而再在调用size方法时,那个实现类实际上是执行了类似count(*)那样的SQL.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-07
为什么不直接在HQL里用count?
|
|
返回顶楼 | |
发表时间:2009-04-08
估计Hibernate中的list的size()方法压根就不是用来做数据总数汇总的,真正的汇总应当使用HQL或者QBC等查询语句调用相应的汇总函数,交由数据库来实现而不能把计算数据总数的任务交个程序把数据一次性的查出了来,在调用list的size()方法。这么做即使你不使用list的size方法,也是一次性的把数据全部加载到内存中。
所以如果业务上确实需要获得查询的总数,应当使用相应的汇总函数把数据汇总的任务交给DB来解决。 这只是我的个人观点!拍砖 |
|
返回顶楼 | |
发表时间:2009-04-08
为什么要用红色遮起来呢?这个属于商业机密麽
|
|
返回顶楼 | |
发表时间:2009-04-08
yidao620c 写道 为什么要用红色遮起来呢?这个属于商业机密麽
呵呵, 不算什么商业机密,但从那一团红色自能看出我现在的公司以及现在的项目,为了避免可能的麻烦就用红色涂了起来. 麻烦还是少惹些为好啦. |
|
返回顶楼 | |
发表时间:2009-04-08
最后修改:2009-04-08
d.setProjection(Projections.countDistinct("id"));
List list = this.findByCriteria(d); int result = 0; for (Iterator it = list.iterator(); it.hasNext();) { Integer item = (Integer) it.next(); result += item; } return result; |
|
返回顶楼 | |
发表时间:2009-04-08
daquan198163 写道 d.setProjection(Projections.countDistinct("id"));
List list = this.findByCriteria(d); int result = 0; for (Iterator it = list.iterator(); it.hasNext();) { Integer item = (Integer) it.next(); result += item; } return result; 谢谢daquan198163, 看你了的解法, 我想通了些: super.getHibernateTemplate().findByCriteria(d)这样的写法是可以得到汇总信息的. 但findByCriteria后list方法还是显的有些不伦不类. ------------ 前进了一步, 可以基于daquan198163的写法写一通用的求汇总信息的父类方法. |
|
返回顶楼 | |
发表时间:2009-04-08
wang19841229 写道 Hibernate中的list的size()方法压根就不是用来做数据总数汇总的,真正的汇总应当使用HQL或者QBC等查询语句调用相应的汇总函数,交由数据库来实现而不能把计算数据总数的任务交个程序把数据一次性的查出了来, 正解list的size()方法是List的方法和Hibernate没有关系,当然也可以用它来做数据总数的汇总。
在criteria中做数据总汇一般是 criteria.setProjection(Projections.rowCount()); return (Integer) hibernateTemplate.execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { return criteria.getExecutableCriteria(session).uniqueResult(); } }); 注意Projections.rowCount(),代码应该还能再简化 |
|
返回顶楼 | |
发表时间:2009-04-08
确实用list去求size是个很占用空间的问题。
更青睐count |
|
返回顶楼 | |
浏览 3095 次