MybatisPlus如何调用count函数
作者:做软件开发的小锋
MybatisPlus调用count函数
项目整合了mybatisPlus时,可以使用count函数做一些简单的统计
项目中遇到一个记录统计,由于项目整合过mybatisPlus,就不通过mybatis去写sql做查询,可通过QueryWrapper方法直接进行查询
调用方法
用mybatisPlus使用count聚合函数时,直接调用.select方法即可,
例如:
csArchiveQueryWrapper.select("COUNT(*) as importNo");
详细server层代码
这里我们通过 QueryWrapper.select() 进行查询,在传入getMap方法,定义map接收,最后取出我们需要的 importNo 即可,由于在实体类中定义的类型为 Integer,所以做了类型转换
代码如下(示例):
public ArchiveRecords query(ArchiveRecordsVo vo) { ………………………… ArchiveRecords records = baseMapper.selectOne(queryWrapper); //查询archive表中档案总条数 QueryWrapper<Archive> ArchiveQueryWrapper= new QueryWrapper<>(); ArchiveQueryWrapper.select("COUNT(*) as importNo"); Map<String , Object> map = archiveService.getMap(ArchiveQueryWrapper); System.out.println("==============>map:" + map); Integer No = Integer.valueOf(String.valueOf(map.get("importNo"))); System.out.println("--------------->取出map中importNo:" + No); System.out.println("--------------->取出map中importNo:" + No); System.out.println("--------------->取出map中importNo:" + No); records1.setImportNo(No); System.out.println("--------------->set后新总条数:" + records.getImportNo()); System.out.println("--------------->set后新总条数:" + records.getImportNo()); System.out.println("--------------->set后新总条数:" + records.getImportNo()); return records; }
控制台输出:
代码如下(示例):
==============>map:{importNo=5}
--------------->取出map中importNo:5
--------------->取出map中importNo:5
--------------->取出map中importNo:5
--------------->set后新总条数:5
--------------->set后新总条数:5
--------------->set后新总条数:5
注意:
在select()中自定义的sql语句,不需要加 from table_name,它会自动拼接,若自己加了,则会出现报错,拼接的sql语句将会变为:
SELECT COUNT(*) as importNo FROM archive FROM archive
sql会多拼接一个 from table_name 这里需要注意一下,需要where条件可通过 QueryWrapper.eq() 等方法实现,可根据实际需求自行选择
注意:
通过mybatisPlus的方法,可以快速的实现某些方法,不用写xml,做层层调用,非常好用。
mybatisplus:Count()方法和groupBy组合使用的报错
错误日志:
java org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
错误代码示例
int studentNum = studentLackDealService.count( new LambdaQueryWrapper<StudentLackDeal>().eq(StudentLackDeal::getBatchId, batchId) .groupBy(StudentLackDeal::getAdmissionTicket));
问题分析
代码看起来没什么问题,是求出groupBy之后的数量,但是此时我们通过生成的sql可以看到:
SELECT COUNT(*) FROM exam_student_lack_deal WHERE del_flag = 0 AND ( batch_id = XXX )
这样查询出来的结果是多行数值:
而mybatis-plus的Count()方法用的是int接收,返回的确是一个list,自然而然就会报错了
解决方案
1. 使用 list() 接收处理,.size()获取数量
int studentNum = studentLackDealService.list( new LambdaQueryWrapper<StudentLackDeal>().eq(StudentLackDeal::getBatchId, batchId) .groupBy(StudentLackDeal::getAdmissionTicket)).size();
2.去除groupBy 使用DISTINCT关键字去重
int studentNum = studentLackDealService.count( new QueryWrapper<StudentLackDeal>().select("DISTINCT admission_ticket").lambda().eq(StudentLackDeal::getBatchId, batchId));
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。