HibernateTemplate 使用Example方式 查询满足条件的记录总数

今天做玩SSH时,发现HibernateTemplate有findByExample()方法,但是返回的是满足输入JavaBean条件的所有JavaBean。如果我只想获取满足条件的记录总数,比如说,在分页的时侯,我要先查询一下总数,然后才能换算出分几页显示,这时如果使用findByExample().size()是不好的,特别是在数据量特别大的时侯。

 

然而Hibernate又没有提供类似countByExample()的方法,一般的方法是使用Query自己写条件,如果JavaBean的属性很多而又不确定哪些属性为null,那就惨了。我查看了一下findByExample()方法,发现完全可以仿照之写一个新的方法如下:

或许已经有其它方法了,但是俺还不太熟悉Spring,所以就将就用一下吧。

	public int countByExample(final Object entityBean) {
		Assert.notNull(entityBean, "Example entity must not be null");
		return (Integer) getHibernateTemplate().executeWithNativeSession(new HibernateCallback() {
			public Object doInHibernate(Session s) throws HibernateException, SQLException {
				//重点就是这个Criteria,属于Hibernate呵呵
				Criteria criteria = s.createCriteria(entityBean.getClass())
						.setProjection(Projections.projectionList()
								.add(Projections.rowCount()))
								.add(Example.create(entityBean));
				//以下全是照抄HibernateTemplate的prepareCriteria方法,因为该方法是protected,
				//不能在外部调用,所以抄了一遍
				if (getHibernateTemplate().isCacheQueries()) {
					criteria.setCacheable(true);
					if (getHibernateTemplate().getQueryCacheRegion() != null)
						criteria.setCacheRegion(getHibernateTemplate().getQueryCacheRegion());
				}
				if (getHibernateTemplate().getFetchSize() > 0)
					criteria.setFetchSize(getHibernateTemplate().getFetchSize());
				if (getHibernateTemplate().getMaxResults() > 0)
					criteria.setMaxResults(getHibernateTemplate().getMaxResults());
				SessionFactoryUtils.applyTransactionTimeout(criteria, getSessionFactory());
				return criteria.uniqueResult();
			}
		});
	} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值