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));

总结

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

相关文章

  • java的多线程高并发详解

    java的多线程高并发详解

    这篇文章主要介绍了java的多线程高并发详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-04-04
  • Java+Mysql学生管理系统源码

    Java+Mysql学生管理系统源码

    这篇文章主要为大家详细介绍了Java+Mysql学生管理系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • MyBatis-Plus allEq()的用法详解

    MyBatis-Plus allEq()的用法详解

    这篇文章主要介绍了MyBatis-Plus allEq()的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java线程的6种状态及切换教程

    Java线程的6种状态及切换教程

    这篇文章主要给大家介绍了关于Java线程的6种状态及切换教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java Management Extensions管理扩展原理解析

    Java Management Extensions管理扩展原理解析

    这篇文章主要介绍了Java Management Extensions管理扩展原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法

    spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法

    下面小编就为大家分享一篇spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • java中i=i++和j=i++的区别小结

    java中i=i++和j=i++的区别小结

    这篇文章主要给大家介绍了关于java中i=i++和j=i++区别的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 详解Java编译优化之循环展开和粗化锁

    详解Java编译优化之循环展开和粗化锁

    之前在讲JIT的时候,有提到在编译过程中的两种优化循环展开和粗化锁,今天从Assembly的角度来验证一下这两种编译优化方法,快来看看吧。
    2021-06-06
  • java servlet获得客户端相关信息的简单代码

    java servlet获得客户端相关信息的简单代码

    这篇文章主要介绍了java servlet获得客户端相关信息的简单代码,有需要的朋友可以参考一下
    2013-12-12
  • Java中spring boot validation自定义注解使用方式

    Java中spring boot validation自定义注解使用方式

    这篇文章主要介绍了Java中spring boot validation自定义注解使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论