记一次使用JPA分页查询SQL优化

本文介绍了在Spring Data JPA中,通过优化SQL查询,利用COUNT(*) OVER()函数避免全表扫描,提高分页查询性能。作者对比了优化前后的代码,并展示了如何在达梦数据库中使用此方法获取总记录数。

没优化前代码如下
问题出在List countList = query.getResultList();
分页查询查总数的时候把所有的数据都查出来了 数据量多的话 会导致查询方法非常慢

		StringBuilder sql = new StringBuilder("SQL语句");

        Query query = em.createNativeQuery(sql.toString());

        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List<JSONObject> countList = query.getResultList();

        Integer curPage = Integer.valueOf(params.get(PlatformPageUtils.CUR_PAGE).toString());
        Integer pageSize = Integer.valueOf(params.get(PlatformPageUtils.PAGE_SIZE).toString());
        Pageable pageable = PageRequest.of(curPage - 1, pageSize);
        query.setFirstResult(pageable.getPageNumber()*pageable.getPageSize());
        query.setMaxResults(pageable.getPageSize());
        List<JSONObject> list = query.getResultList();
        Page<JSONObject> page = new PageImpl<>(list,pageable,countList.size());
        return page;

优化后的代码如下
用了一个函数COUNT(*) OVER() 分页查询的时候可以同时把总数查出来
楼主用的是达梦数据库 不同数据库 这个函数不一样

		StringBuilder sql = new StringBuilder("SELECT COUNT(*) OVER() TOTAL 。。。");

        Query query = em.createNativeQuery(sql.toString());

        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

        Integer curPage = Integer.valueOf(params.get(PlatformPageUtils.CUR_PAGE).toString());
        Integer pageSize = Integer.valueOf(params.get(PlatformPageUtils.PAGE_SIZE).toString());
        Pageable pageable = PageRequest.of(curPage - 1, pageSize);
        query.setFirstResult(pageable.getPageNumber()*pageable.getPageSize());
        query.setMaxResults(pageable.getPageSize());
        List<JSONObject> list = query.getResultList();
        int total = 0;
        if(list.size() != 0)
            total = new JSONObject(list.get(0)).getIntValue("TOTAL");
        Page<JSONObject> page = new PageImpl<>(list,pageable,total);
        return page;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值