使用mybatis对于数值型数据进行排序时请务必注意字段名称!!!

本文讲述了在使用MyBatis进行大数据排序时遇到的问题,即bigint类型数据默认按照ASCII码排序,而非数值排序。通过在SQL中添加+0解决,但这种方法影响查询性能。作者发现问题可能源于字段名称不一致,通过在Service层处理字段名,将'problemId'转换为'problem_id',成功解决问题。总结指出在MyBatis中,确保排序字段名与数据库字段名一致是关键。
摘要由CSDN通过智能技术生成

事情是这样的,刚才在做一个bigint型数据的排序时,发现排序之后的结果总是按照ascii码来进行的排序,那么显然这样是不合适的。
然后我就从网上找了找,说是修改${sort}为${sort}+0就正常按照数字排序了,如下:

<choose>
      <when test="sort != null and sort.trim() != ''">
           order by ${sort}+0 ${order}
      </when>
      <otherwise>
           order by `problem_id` asc
      </otherwise>
 </choose>

确实,这样是可以解决这个问题的,但是这样做,有个很明显的问题就是严重影响查询的性能,因为要给每条记录都要有个加0操作。而且这种一般是针对于字符串排序时,我们不想根据ascii码排时才这样操作。。
那么到底该怎么解决这个问题呢?
然后我就走了一遍这个流程,从我前端将bootstarp_table里面给problemId字段设置为了sortable,,然后一直传到mybatis,我发现这时候mybatis不知道是怎么处理的problemId字段的,我没有深入研究这个(有过研究的同学可以告知我一下),反正最后的结果就是按照了数据库中problem_id字段的ascii码进行了排序。。
想到这里,我猜测是不是因为我给mybatis传的是problemId而不是problem_id,导致的这个问题呢?
然后我在service层做了如下处理

String sortField = (String) query.get("sort");//query为我封装的一个map对象
        if(sortField!=null){
            if(sortField.matches("(.*?)(Id)")){
                query.replace("sort",sortField.split("Id")[0]+"_id");
            }
        }

然后,问题完美解决了!!!
总结:使用mybatis对于数值型数据进行排序时,我们要
注意排序的字段名称尽量和数据库中的字段名一致!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值