MybatisPlus如何调用count函数

 更新时间:2023年08月12日 16:51:35   作者:做软件开发的小锋  
这篇文章主要介绍了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));

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论