zoukankan      html  css  js  c++  java
  • Hibernate实现limit语句效果

    Hibernate

    hibernate实现limit效果

    • 由于hql语句内无法直接书写limit语法,所以需要通过别的方式来达成这个效果
    • limit效果一般需要有两个参数:开始位置start和查询数量num。两个参数都是final int型
    • 实现代码如下:
    try {
                //首先新建一个final型的hql语句
                final String hql="from xxb where xx="+xx+" order by xx asc ";
                //hibernate执行查找,参数为请求返回方法
                List<xx> xxList=getHibernateTemplate().executeFind(new HibernateCallback() {
                    public Object doInHibernate(Session session){
                        //创建查找对象 ,设置起始位置以及查询数量
                        Query query=session.createQuery(hql);
                        query.setFirstResult(start);
                        query.setMaxResults(num);
                        //转换为list形式
                        return query.list();
                    }
                });
                return xxList;
            }catch (RuntimeException e){
                throw  e;
            }
    
    • 对于实现过程中的两个相关方法,截取其源码贴在下方,也可以自行查看。
      • executeFind方法实现如下:
    public List executeFind(HibernateCallback<?> action) throws DataAccessException { 
            Object result = this.doExecute(action, false, false);
            if (result != null && !(result instanceof List)) {
                throw new InvalidDataAccessApiUsageException("Result object returned from HibernateCallback isn't a List: [" + result + "]");
            } else {
                return (List)result;
            }
        }
    
    • doInHibernate方法实现如下:
        public List<T> doInHibernate(Session session) throws HibernateException, SQLException {
            Query query = session.createQuery(this.hql).setFirstResult(this.pageModel.getBeginIndex()).setMaxResults(this.pageModel.getPageSize());
            if (!CollectionUtil.listIsNull(this.params)) {
                for(int i = 0; i < this.params.size(); ++i) {
                    Object obj = this.params.get(i);
                    if (obj instanceof String) {
                        query.setString(i, (String)obj);
                    } else if (obj instanceof Integer) {
                        query.setInteger(i, (Integer)obj);
                    } else if (obj instanceof Date) {
                        query.setDate(i, (Date)obj);
                    }
                }
            }
    
            List<T> list = query.list();
            String counthql = "select count(*) " + this.hql;
            Query countQuery = session.createQuery(counthql);
            if (!CollectionUtil.listIsNull(this.params)) {
                for(int i = 0; i < this.params.size(); ++i) {
                    Object obj = this.params.get(i);
                    if (obj instanceof String) {
                        countQuery.setString(i, (String)obj);
                    } else if (obj instanceof Integer) {
                        countQuery.setInteger(i, (Integer)obj);
                    } else if (obj instanceof Date) {
                        countQuery.setDate(i, (Date)obj);
                    }
                }
            }
    
            List<Object> countList = countQuery.list();
            if (CollectionUtil.listIsNull(countList)) {
                this.pageModel.setTotalCount(0L);
            } else {
                this.pageModel.setTotalCount((Long)countList.get(0));
            }
    
            return list;
        }
    
  • 相关阅读:
    数据库被注入daxia123原因及解决办法
    Alipay数字证书管理员权限问题
    关闭数据库的xp_cmdshell命令以防止黑客攻击
    如何使用JavaScript来写ASP程序
    VBscript操作DOM
    如何做好性能压测丨压测环境设计和搭建
    10倍性能提升!DLA SQL推出基于Alluxio的数据湖分析加速功能
    高德地图驾车导航内存优化原理与实战
    「直播实录」中英数据库专家谈:数据库的过去、未来和现在
    Flink 助力美团数仓增量生产
  • 原文地址:https://www.cnblogs.com/lfz1211/p/11284132.html
Copyright © 2011-2022 走看看