`
suiyuan17
  • 浏览: 48514 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate分页

阅读更多
    /**
     * DAO操作基类<br>
     * 本DAO层实现了通用的数据操作
     * 
     * @author 黄磊
     * 
     * @param <T>
     *            POJO实体对象
     * @param <ID>
     *            ID
     */ 
    @SuppressWarnings("unchecked") 
    public class BaseHibernateDAO<T, ID extends Serializable> extends 
            HibernateDaoSupport { 
     
        private static final Logger logger = Logger 
                .getLogger(BaseHibernateDAO.class); 
     
        /**
         * 保存指定实体类
         * 
         * @param entityobj
         *            实体类
         */ 
        public void save(T entity) { 
            try { 
                getHibernateTemplate().save(entity); 
                if (logger.isDebugEnabled()) { 
                    logger.debug("保存实体类成功," + entity.getClass().getName()); 
                } 
            } catch (RuntimeException e) { 
                logger.error("保存实体异常," + entity.getClass().getName(), e); 
                throw e; 
            } 
        } 
     
        /**
         * 删除指定实体
         * 
         * @param entityobj
         *            实体类
         */ 
        public void delete(T entity) { 
            try { 
                getHibernateTemplate().delete(entity); 
                if (logger.isDebugEnabled()) { 
                    logger.debug("删除实体类成功," + entity.getClass().getName()); 
                } 
            } catch (RuntimeException e) { 
                logger.error("删除实体异常", e); 
                throw e; 
            } 
        } 
     
        /**
         * 获取所有实体集合
         * 
         * @param entityClass
         *            实体
         * @return 集合
         */ 
        public List<T> findAll(Class<T> entityClass) { 
            try { 
                if (logger.isDebugEnabled()) { 
                    logger.debug("开始删除实体:" + entityClass.getName()); 
                } 
                return getHibernateTemplate().find("from " + entityClass.getName()); 
            } catch (RuntimeException e) { 
                logger.error("查找指定实体集合异常,实体:" + entityClass.getName(), e); 
                throw e; 
            } 
        } 
     
        /**
         * 更新或保存指定实体
         * 
         * @param entity
         *            实体类
         */ 
        public void saveOrUpdate(T entity) { 
            try { 
                getHibernateTemplate().saveOrUpdate(entity); 
                if (logger.isDebugEnabled()) { 
                    logger.debug("更新或者保存实体成功," + entity.getClass().getName()); 
                } 
            } catch (RuntimeException e) { 
                logger.error("更新或保存实体异常", e); 
                throw e; 
            } 
        } 
     
        /**
         * 查找指定ID实体类对象
         * 
         * @param entityClass
         *            实体Class
         * @param id
         *            实体ID
         * @return 实体对象
         */ 
        public T findById(Class<T> entityClass, ID id) { 
            try { 
                if (logger.isDebugEnabled()) { 
                    logger.debug("开始查找ID为" + id + "的实体:" + entityClass.getName()); 
                } 
                return (T) getHibernateTemplate().get(entityClass, id); 
            } catch (RuntimeException e) { 
                logger.error("查找指定ID实体异常,ID:" + id, e); 
                throw e; 
            } 
        } 
     
        /**
         * 查询指定HQL,并返回集合
         * 
         * @param hql
         *            HQL语句
         * @param values
         *            可变的参数列表
         * @return 集合
         */ 
        public List<Object> find(String hql, Object... values) { 
            try { 
                if (logger.isDebugEnabled()) { 
                    logger.debug("开始查询指定HQL语句," + hql); 
                } 
                return getHibernateTemplate().find(hql, values); 
            } catch (RuntimeException e) { 
                logger.error("查询指定HQL异常,HQL:" + hql, e); 
                throw e; 
            } 
        } 
     
        /**
         * 按照HQL语句查询唯一对象.
         * 
         * @param hql
         *            HQL语句
         * @param values
         *            可变参数集合
         * @return OBJECT对象
         */ 
        public Object findUnique(final String hql, final Object... values) { 
            try { 
                if (logger.isDebugEnabled()) { 
                    logger.debug("开始查询返回唯一结果的HQL语句," + hql); 
                } 
                return getHibernateTemplate().execute(new HibernateCallback() { 
                    public Object doInHibernate(Session s) 
                            throws HibernateException, SQLException { 
                        Query query = createQuery(s, hql, values); 
                        return query.uniqueResult(); 
                    } 
                }); 
            } catch (RuntimeException e) { 
                logger.error("查询指定HQL异常,HQL:" + hql, e); 
                throw e; 
            } 
        } 
     
        /**
         * 查找指定HQL并返回INT型
         * 
         * @param hql
         *            HQL语句
         * @param values
         *            可变参数列表
         * @return INT
         */ 
        public int findInt(final String hql, final Object... values) { 
            return Tools.null2Int(findUnique(hql, values)); 
        } 
     
        /**
         * 获取指定实体Class指定条件的记录总数
         * 
         * @param entityClass
         *            实体Class
         * @param where
         *            HQL的查询条件,支持参数列表
         * @param values
         *            可变参数列表
         * @return 记录总数
         */ 
        public int findTotalCount(Class<T> entityClass, final String where, 
                final Object... values) { 
            String hql = "select count(e) from " + entityClass.getName() + " as e " 
                    + where; 
            return findInt(hql, values); 
        } 
     
        /**
         * 获取指定实体Class的记录总数
         * 
         * @param entityClass
         *            实体Class
         * @return 记录总数
         */ 
        public int findTotalCount(Class<T> entityClass) { 
            return findTotalCount(entityClass, ""); 
        } 
     
        /**
         * 查找指定属性的实体集合
         * 
         * @param entityClass
         *            实体
         * @param propertyName
         *            属性名
         * @param value
         *            条件
         * @return 实体集合
         */ 
        public List<T> findByProperty(Class<T> entityClass, String propertyName, 
                Object value) { 
            try { 
                if (logger.isDebugEnabled()) { 
                    logger.debug("开始查找指定属性:" + propertyName + "为" + value + "的实体" 
                            + entityClass.getName()); 
                } 
                String queryStr = "from " + entityClass.getName() 
                        + " as model where model." + propertyName + "=?"; 
                return getHibernateTemplate().find(queryStr, value); 
            } catch (RuntimeException e) { 
                logger.error("查找指定条件实体集合异常,条件:" + propertyName, e); 
                throw e; 
            } 
        } 
     
        /**
         * 模糊查询指定条件对象集合 <br>
         * 用法:可以实例化一个空的T对象,需要查询某个字段,就set该字段的条件然后调用本方法<br>
         * 缺点:目前测试貌似只能支持String的模糊查询,虽然有办法重写,但没必要,其他用HQL<br>
         * 
         * @param entity
         *            条件实体
         * @return 结合
         */ 
        public List<T> findByExample(T entity) { 
            try { 
                List<T> results = getHibernateTemplate().findByExample(entity); 
                return results; 
            } catch (RuntimeException re) { 
                logger.error("查找指定条件实体集合异常", re); 
                throw re; 
            } 
        } 
     
        /**
         * 补充方法(未测) 据说可以无视session的状态持久化对象
         * 
         * @param entity
         *            实体类
         * @return 持久后的实体类
         */ 
        public T merge(T entity) { 
            try { 
                T result = (T) getHibernateTemplate().merge(entity); 
                return result; 
            } catch (RuntimeException re) { 
                logger.error("merge异常", re); 
                throw re; 
            } 
        } 
     
        /**
         * 清除实体的锁定状态<br>
         * 方法未测
         * 
         * @param entity
         *            实体
         */ 
        public void attachClean(T entity) { 
            try { 
                getHibernateTemplate().lock(entity, LockMode.NONE); 
            } catch (RuntimeException re) { 
                logger.error("实体解锁异常", re); 
                throw re; 
            } 
        } 
     
        /**
         * 按HQL分页查询.
         * 
         * @param page
         *            页面对象
         * @param hql
         *            HQL语句
         * @param values
         *            可变参数列表
         * @return 分页数据
         */ 
        public Page<T> findByPage(final Page<T> page, final String hql, 
                final Object... values) { 
            try { 
                if (logger.isDebugEnabled()) { 
                    logger.debug("开始查找指定HQL分页数据," + hql); 
                } 
                return (Page<T>) getHibernateTemplate().execute( 
                        new HibernateCallback() { 
                            public Object doInHibernate(Session s) 
                                    throws HibernateException, SQLException { 
                                Query query = createQuery(s, hql, values); 
                                if (page.isFirstSetted()) { 
                                    query.setFirstResult(page.getFirst()); 
                                } 
                                if (page.isPageSizeSetted()) { 
                                    query.setMaxResults(page.getPageSize()); 
                                } 
                                page.setResult(query.list()); 
                                if (logger.isDebugEnabled()) { 
                                    logger.debug("查找指定HQL分页数据成功," + hql); 
                                } 
                                return page; 
                            } 
                        }); 
            } catch (RuntimeException e) { 
                logger.error("分页查询异常,HQL:" + hql, e); 
                throw e; 
            } 
        } 
     
        /**
         * 根据查询条件与参数列表创建Query对象
         * 
         * @param session
         *            Hibernate会话
         * @param hql
         *            HQL语句
         * @param objects
         *            参数列表
         * @return Query对象
         */ 
        public Query createQuery(Session session, String hql, Object... objects) { 
            Query query = session.createQuery(hql); 
            if (objects != null) { 
                for (int i = 0; i < objects.length; i++) { 
                    query.setParameter(i, objects[i]); 
                } 
            } 
            return query; 
        } 
     
        /**
         * 从Spring上下文中获取本类对象<br>
         * 此方法可能存在线程并发问题(待测)
         * 
         * @param context
         *            Spring上下文
         * @return 本类对象
         */ 
        public static BaseHibernateDAO getFromApplicationContext( 
                WebApplicationContext context) { 
            return (BaseHibernateDAO) context.getBean("BaseHibernateDAO"); 
        } 
     
    } 

 

QueryParameter.java


Java代码  收藏代码

    /**
     * 本类封装分页和排序查询请求参数.
     * 本类参考自springside的ORM封装设计
     * 
     * 
     * 
     */ 
    public class QueryParameter { 
         
        public static final String ASC = "asc"; 
        public static final String DESC = "desc"; 
     
        protected int pageNo = 1; 
        protected int pageSize = -1; 
        protected String orderBy = null; 
        protected String order = ASC; 
        protected boolean autoCount = false; 
     
        /**
         * 获得每页的记录数量,无默认值.
         */ 
        public int getPageSize() { 
            return pageSize; 
        } 
     
        public void setPageSize(int pageSize) { 
            this.pageSize = pageSize; 
        } 
     
        /**
         * 是否已设置每页的记录数量.
         */ 
        public boolean isPageSizeSetted() { 
            return pageSize > -1; 
        } 
     
        /**
         * 获得当前页的页号,序号从1开始,默认为1.
         */ 
        public int getPageNo() { 
            return pageNo; 
        } 
     
        public void setPageNo(int pageNo) { 
            this.pageNo = pageNo; 
        } 
     
        /**
         * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从0开始.
         */ 
        public int getFirst() { 
            if (pageNo < 1 || pageSize < 1) 
                return -1; 
            else 
                return ((pageNo - 1) * pageSize); 
        } 
     
        /**
         * 是否已设置第一条记录记录在总结果集中的位置.
         */ 
        public boolean isFirstSetted() { 
            return (pageNo > 0 && pageSize > 0); 
        } 
     
        /**
         * 获得排序字段,无默认值.
         */ 
        public String getOrderBy() { 
            return orderBy; 
        } 
     
        public void setOrderBy(String orderBy) { 
            this.orderBy = orderBy; 
        } 
     
        /**
         * 是否已设置排序字段.
         */ 
        public boolean isOrderBySetted() { 
            return StringUtils.isNotBlank(orderBy); 
        } 
     
        /**
         * 获得排序方向,默认为asc.
         */ 
        public String getOrder() { 
            return order; 
        } 
     
        /**
         * 设置排序方式向.
         * 
         * @param order
         *            可选值为desc或asc.
         */ 
        public void setOrder(String order) { 
            if (ASC.equalsIgnoreCase(order) || DESC.equalsIgnoreCase(order)) { 
                this.order = order.toLowerCase(); 
            } else 
                throw new IllegalArgumentException( 
                        "order should be 'desc' or 'asc'"); 
        } 
     
        /**
         * 是否自动获取总页数,默认为false. 注意本属性仅于query by Criteria时有效,query by HQL时本属性无效.
         */ 
        public boolean isAutoCount() { 
            return autoCount; 
        } 
     
        public void setAutoCount(boolean autoCount) { 
            this.autoCount = autoCount; 
        } 
    } 



Page.java


Java代码  收藏代码

    /**
     * 封装分页和排序查询的结果,并继承QueryParameter的所有查询请求参数.
     *
     * @param <T> Page中的记录类型.
     */ 
    public class Page<T> extends QueryParameter { 
         
        private List<T> result = null; 
     
        private int totalCount = -1; 
     
        public Page() { 
        } 
     
        public Page(int pageSize) { 
            this.pageSize = pageSize; 
        } 
     
        public Page(int pageSize, boolean autoCount) { 
            this.pageSize = pageSize; 
            this.autoCount = autoCount; 
        } 
     
        /**
         * 取得倒转的排序方向
         */ 
        public String getInverseOrder() { 
            if (order.endsWith(DESC)) 
                return ASC; 
            else 
                return DESC; 
        } 
     
        /**
         * 页内的数据列表.
         */ 
        public List<T> getResult() { 
            return result; 
        } 
     
        public void setResult(List<T> result) { 
            this.result = result; 
        } 
     
        /**
         * 总记录数.
         */ 
        public int getTotalCount() { 
            return totalCount; 
        } 
     
        public void setTotalCount(int totalCount) { 
            this.totalCount = totalCount; 
        } 
     
        /**
         * 计算总页数.
         */ 
        public Integer getTotalPages() { 
            if (totalCount == -1) 
                return -1; 
     
            int count = totalCount / pageSize; 
            if (totalCount % pageSize > 0) { 
                count++; 
            } 
            return new Integer(count); 
        } 
     
        /**
         * 是否还有下一页.
         */ 
        public boolean isHasNext() { 
            return (pageNo + 1 <= getTotalPages()); 
        } 
     
        /**
         * 返回下页的页号,序号从1开始.
         */ 
        public int getNextPage() { 
            if (isHasNext()) 
                return pageNo + 1; 
            else 
                return pageNo; 
        } 
     
        /**
         * 是否还有上一页. 
         */ 
        public boolean isHasPre() { 
            return (pageNo - 1 >= 1); 
        } 
     
        /**
         * 返回上页的页号,序号从1开始.
         */ 
        public int getPrePage() { 
            if (isHasPre()) 
                return pageNo - 1; 
            else 
                return pageNo; 
        } 
    } 
分享到:
评论

相关推荐

    Hibernate分页查询小结

    Hibernate分页查询小结

    Hibernate分页查询原理解读

    #### 三、Hibernate分页查询实现原理 ##### 3.1 使用SQL LIMIT实现分页 对于支持LIMIT关键字的数据库(例如MySQL),Hibernate会通过特定的方言(Dialect)来生成包含LIMIT关键字的SQL语句。具体实现如下: ```...

    hibernate分页查询 数据库连接

    此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...

    hibernate分页Hibernate 分页的设计和编码

    标题与描述均提到了“Hibernate分页的设计和编码”,这表明文章主要聚焦于如何在Hibernate框架中实现数据分页功能。下面将详细解析这一主题的关键知识点。 ### Hibernate分页概念 Hibernate是Java环境下一个开放源...

    hibernate分页查询

    让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults...

    strut2.0 + hibernate3.0 + jquery.datatables+mysql 5.0实现的 hibernate分页

    hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网http://www.datatables.net/,datatables的功能很 全面。 2,建表的sql--studentinfo和插入...

    hibernate分页代码

    总结起来,"hibernate分页代码"是一个关于如何在Hibernate中进行分页查询的实践示例,适用于在MyEclipse环境下运行。通过Criteria API或HQL,开发者能够方便地实现分页功能,提升应用性能,为用户提供更好的体验。...

    Struts + Hibernate 分页实现

    在"Struts + Hibernate 分页实现"这个项目中,重点在于如何在Web应用中整合这两个框架,并实现数据的分页显示。分页是大型数据集处理时常见的需求,它能够帮助用户更有效地浏览和管理大量信息,避免一次性加载所有...

    struts2+spring+hibernate分页显示完整代码

    本篇文章将详细讲解如何在基于Struts2、Spring和Hibernate的项目中实现分页功能。 首先,我们从DAO层开始。在`MemberDao`接口中,我们定义了两个关键的方法,一个是用于分页查询,另一个是获取所有记录的数量。这两...

    Struts和Hibernate分页及查询

    在"Struts+Hibernate分页及条件查询练习"这个项目中,开发者可能采用了以下步骤: 1. **配置Struts和Hibernate**:首先,需要在项目中引入Struts和Hibernate的相关库,配置Struts的struts-config.xml文件和...

    使用hibernate分页查询

    1. **配置Hibernate分页**: 在Hibernate中,我们通常使用`Criteria`或`Query` API进行分页查询。`Criteria`提供了一种更面向对象的方式来执行SQL查询,而`Query` API则对应于原生的SQL语句。在这些API中,我们可以...

    hibernate分页技巧

    hibernate分页 博文链接:https://iomo.iteye.com/blog/243518

    Hibernate 分页查询效果

    本篇主要围绕"Hibernate分页查询效果"这一主题,深入探讨如何利用Hibernate框架实现高效、便捷的分页功能。 首先,Hibernate是一个优秀的Java持久化框架,它提供了ORM(对象关系映射)解决方案,使得开发者可以使用...

    高效率的dw+spring+hibernate分页演示例子

    这个"高效率的dw+spring+hibernate分页演示例子"提供了一个实用的示例,展示了如何将这三个框架整合起来,以实现高效的数据分页功能。 首先,让我们来逐一了解这三个技术: 1. **DWR (Direct Web Remoting)**:DWR...

    hibernate实现分页

    ### Hibernate分页基础 1. **Criteria API**:Hibernate的Criteria API允许我们创建动态查询,同时也支持分页。通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria ...

    struts+hibernate分页

    综上所述,"struts+hibernate分页"涉及到的主要是如何在Struts的控制层和Hibernate的数据层之间协调处理分页请求,以及在DAO层利用Hibernate的特性实现数据库查询的分页。理解并掌握这两个框架的分页机制,对于开发...

    java 实现的一个简单的hibernate分页类

    java 实现的一个简单的hibernate分页类 可以设置,从某一条开始取、显示的条数 不依赖struts spring

    hibernate分页例子.rar

    本教程将通过一个具体的“hibernate分页例子”来深入理解如何在Hibernate中实现分页功能。 在实际应用中,当数据量大到一定程度时,一次性加载所有数据会导致内存压力过大,影响系统性能。因此,分页查询成为一种...

    关于Hibernate分页类和jdbc的sql分页完美融合

    本主题将探讨如何在Hibernate分页类和JDBC的SQL分页方法之间实现完美的融合,以提高性能并提供更好的用户体验。 首先,让我们了解一下Hibernate的分页功能。Hibernate提供了一种方便的方式来处理分页查询,通过...

Global site tag (gtag.js) - Google Analytics