HibernateTemplate 使用Example方式 查询满足条件的记录总数
程序员文章站
2024-03-01 23:58:22
...
今天做玩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();
}
});
}