关于criteria分页中获取总记录数异常问题

一、情景在线

  运维同事反馈了一个问题,说咱们查询分机号码的api 接口返回数据异常,具体的情况时是:

  1.查询时第一页信息所返回的总记录数正确,数据正确。
  2.查询第二页总记录数为 “0” ,数据为对应的第二页数据。 what!!!

二、为题排查

  按照同事的提供的线索,在本地复现发现-->果然如此! 传入当前页 pageNow>1 时 总数totel 将为零,且必现!

  多次测试发现:
  传入pageNow=1 控制台打印的sql
  select count(*) as y0_ from xtboss.biz_api_extensions this_ where this_.number400=? and this_.isdeleted=? limit ?
  传入pageNow>1   打印 sql
  select count(*) as y0_ from xtboss.biz_api_extensions this_ where this_.number400=? and this_.isdeleted=? limit ?, ?。

  于是我翻看了代码,

看了一下我们同事写的接口发现。
  @Override
  //根据Criteria获取记录数
  public Object getCountByCriteria(Criteria criteria, Map<String, String> map, int pageSize,
  int pageNo) {
    criteria.setProjection(Projections.rowCount());
    List<?> ls=this.findByCriteria(criteria, null, 0, 0);
    //改参数设置为空后这句的作用是将原来设置Projection(投影,投影图)的清空,否则只能查 到满足条件的总记录数而criteria.list()将没有记录
    criteria.setProjection(null);
    if(CommonUtil.notEmpty(ls)){
    return ls.get(0);
    }
    return 0;
  同事封装的底层方法,中将criteria.setProjection(null); 将Projection(投影,投影图)的清空 ,后criteria.list()将没有记录数。
  于是我该部分代码给修改了一下:
 
 public Object getCountByCriteria(Criteria criteria, Map<String, String> map, int pageSize,
  int pageNo) {
     Integer total=(Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();
     criteria.setProjection(Projections.rowCount());
      //List<?> ls=this.findByCriteria(criteria, null, 0, 0);
    //改参数设置为空后这句的作用是将原来设置Projection(投影,投影图)的清空,否则只能查 到满足条件的总记录数而criteria.list()将没有记录
   // criteria.setProjection(null);
   // if(CommonUtil.notEmpty(ls)){
   // return ls.get(0);
   / }
     if(total=null){
    return 0;}
    return total;
  问题完美解决!!!!
 

转载于:https://www.cnblogs.com/xingtangxublog/p/8735191.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在给定的代码criteria是一个用于设置查询条件的对象。它是通过调用`getCriteria(Class clazz)`方法创建的。该方法返回一个由`sessionFactory.getCurrentSession().createCriteria(clazz)`方法创建的Criteria对象,该对象用于设置查询条件。然后,通过调用`listByPage(Criteria criteria, PageResult pageResult)`方法执行带有查询条件的分页查询。在该方法,首先根据排序规则设置排序顺序,然后根据分页设置查询结果的起始位置和每页记录。最后,将查询结果设置到PageResult对象,并返回该对象。这样,就完成了基于criteria分页查询。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [使用Criteria进行分页查询通用方法提](https://blog.csdn.net/cndotaci/article/details/4395523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [【Hibernate】Criteria条件、动态、分页、排序、连接、投影、聚合、分组查询丶离线查询](https://blog.csdn.net/u013087359/article/details/106278411)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值