在SSH框架中注入HibernateTemplate进行分页等相关查询

来源:互联网 发布:远程教育软件哪家好 编辑:程序博客网 时间:2024/06/13 01:01

本文主要讲解一下三个问题:
1、如何用注入的HibernateTemplate进行分页
2、如何用注入的HibernateTemplate动态分页
3、如何用注入的HibernateTemplate在动态情况下获得其总记录数

首先,我用到的是在Spring中注入HibernateTemplate模板进行查询:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">        <property name="dataSource" ref="dataSource" />        <property name="configLocations" value="classpath:hibernate.cfg.xml" />        <property name="mappingLocations" value="classpath:hbmXML/*.hbm.xml"></property>    </bean>    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">        <property name="sessionFactory" ref="sessionFactory"></property>    </bean>

这里的dataSource是数据库连接池,接下来在**DaoImpl.java文件中通过注解注入HibernateTemplate:

@Repository("bookDao")public class BookDaoImpl implements BookDao {    @Resource    private HibernateTemplate hibernateTemplate;}

接下来说明一下问题:

1. 如何用注入的HibernateTemplate进行分页

/**     * 静态的hql语句分页查询:     *      * @param hql       hql语句     * @param offset    起始点     * @param length    长度     * @return          每页的查询结合     */    public List<?> getListForPage(final String hql, final int offset, final int length) {        List<?> list = hibernateTemplate.executeFind(new HibernateCallback<Object>() {            public Object doInHibernate(Session session) throws HibernateException, SQLException {                Query query = session.createQuery(hql);                query.setFirstResult(offset);                query.setMaxResults(length);                List<?> list = query.list();                return list;            }        });        return list;    }

跟网上的一些查询差不多,不过这里我注入的HibernateTemplate。

2、如何用注入的HibernateTemplate动态分页

    /**     * 动态hql查询     *      * @param className   实体类的class(Object.class)     * @param criterions  限制条件结合     * @param offset      起始点     * @param length      每页个数     * @return            每页的查询结合     */    public List<?> getListForPage(final Class<?> className, final Criterion[] criterions, final int offset, final int length) {        List<?> list = hibernateTemplate.executeFind(new HibernateCallback<Object>() {            public Object doInHibernate(Session session) throws HibernateException, SQLException {                Criteria criteria = session.createCriteria(className);                // 循环遍历添加约束条件                for (int i = 0; i < criterions.length; i++) {                    criteria.add(criterions[i]);                }                criteria.setFirstResult(offset);                criteria.setMaxResults(length);                return criteria.list();            }        });        return list;    }

参数className:是实体类的类名,通过这个参数获得criteria。例如:className是Sort.class,翻译过来的hql语句是“from Sort”。
参数criterions :是限制条件的数组,相当于hql中where后面的语句,例如:Criterion[] criterions = {Restrictions.eq(“sortId”, 1)};翻译过来的hql语句是:from Sort where sortId = 1。
其他参数应该很好理解,需要更多的查询条件可以自己搜索Restrictions。

3、如何用注入的HibernateTemplate在动态情况下获得其总记录数

/**     * 在动态查询的条件下,获得其总的记录数     * @param className     * @param criterions     * @return     */    public int getTotalCount(final Class<?> className, final Criterion[] criterions) {        List<?> count = hibernateTemplate.executeFind(new HibernateCallback<Object>() {            public List<Integer> doInHibernate(Session session) throws HibernateException, SQLException {                Criteria criteria = session.createCriteria(className);                for (int i = 0; i < criterions.length; i++) {                    criteria.add(criterions[i]);                }                criteria.setProjection(Projections.rowCount());                List<Integer> list = new ArrayList<Integer>();                list.add(Integer.parseInt(criteria.uniqueResult().toString()));                return list;            }        });        return (Integer)count.get(0);

最好不要通过2中案例的criteria.list().size()方法直接返回总的条件查询记录数,原因和导致的结果网上都有介绍,这里不再说明。

0 0
原创粉丝点击