Springboot+JPA+Hibernate动态查询及分页,使用Pageable以及entityManager

记录一下最近写分页以及动态查询,以及对返回的page对象的处理

分页以及动态查询

因为要动态查询,继承JpaRepository+注解的方式请见:https://blog.csdn.net/qq_43948440/article/details/111557411.
这里使用EntityManager。分页使用Spring Data 库中的分页接口。
之后根据条件拼接SQL,进行查询,返回分页的page对象。

代码:
设置分页参数:

Pageable pageable;
//参数对应分别为:第几页,每页显示条数
pageable = PageRequest.of(page-1,pageNum);

注 意 : \color{red}{注意:} 如果不重写Pageable的话,设置第几页的时候需要减一,因为默认是从0开始的。上边参数还可以添加排序方式,如果需要,添加即可,例如(通过id降序排序):

pageable = PageRequest.of(page-1,pageNum, Sort.Direction.DESC, "id");

下面是我自己封装的一个分页的代码,传入查询的SQL语句以及Pageable对象即可:

	//分页
    public Page<T> pageResult(String querySql, Pageable pageable){
        //查询数据条数
        String countSql = "SELECT COUNT(*)  FROM ( "+ querySql +" ) getcount";
        Query countQuery = entityManager.createNativeQuery(countSql);
        //总条数
        BigDecimal totalCount = (BigDecimal) countQuery.getSingleResult();

        Query query = entityManager.createNativeQuery(querySql);
        query.setFirstResult((int) pageable.getOffset());
        query.setMaxResults(pageable.getPageSize());
        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List resultList = query.getResultList();
        Page<T> page = new PageImpl<>(resultList,pageable,totalCount.longValue());
        return page;
    }
对返回的page的处理

以上返回的page包含了数据信息以及分页信息,因为我只需要数据信息,以及总页码数,所以封装了返回结果对象:

@Data
public class PageRsp {
    private Integer totalPages;
    private List<Info> infoList = new ArrayList<>();
}

取出需要的数据并赋值给对象:

 List infoList = infoPage.getContent();
 PageRsp rsp = new PageRsp();
 rsp.getInfoList().addAll(infoList);
 rsp.setTotalPages(infoPage.getTotalPages());
 

之后将数据返回即可。
这是为了简便提取出的代码,在方法中稍加修改即可使用。另外如果需要其他的分页信息,对返回的page处理即可。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值