- 前言
- 查询的记录有多条
- 查询二 SQL语句使用了聚合函数
- 查询三 返回值类型为map
前言
使用Mybatis进行查询的时候,查询出来的数据可能有一条数据,也可能是多条,我们就得根据返回数据的条数来指定返回类型,如果记录是多条,那么返回值类型就不能是实体类。
查询的记录有多条
如果查询出来有多条记录,但是我们方法的返回类型是实体类,就会报下面的错误
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne()
因为,当我们的方法返回值类型是实体类,底层会调用selectOne方法,这个方法的返回数据只能有一个
总结:查询出来的记录有一条,返回值类型可以是实体类,也可以是集合,如果记录有多条,返回值类型可以设置成List集合,也可以是Map集合,但是一定不能设置成实体类类型,不然报错TooManyResultsException
查询二 SQL语句使用了聚合函数
我们有的时候,希望能够查询出来有多少条记录,那么SQL语句就使用了分组函数,那么查询出来的结果应该是单行单列
/**
* 查询用户信息的总记录数
* @param
* @return
*/
Integer getCount();
大家有没有感觉很神奇,为什么会是这个样子的呢?原因是因为mybatis设置了类型别名
MyBatis 已经为Java类型取好的别名(自己起别名时小心重复)
MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。
查询三 返回值类型为map
当返回数据是一条
如果我们查询出来的结果没有一个实体类与之相对应,我们就可以把返回值类型设置成为Map集合
看到上面查询记录为一条的时候,我们用map可以查询出记录,我们再来看看如果记录是多条,用刚刚的方法能不能查询出来
Map<String,Object> getUserMap();
解决方法:把多个map放在list集合中
List<Map<String,Object>> getUserMapToList();
难道说map集合一定要放在list集合中,才可以把查询到的多条记录输出吗?答案是no,我们其实是有办法的,通过注解就可以了
@MapKey(“id”)
Map<String,Object> getUserMap();
这个是官方解释
在这里我们推荐一篇比较详细的介绍,大家可以看看:
Mybatis源码分析:@Mapkey的使用总结:如果查询出来的记录有多条,我们可以有下面几种解决方法
①通过实体类类型的List集合接收
②通过map类型的List集合接收
③在mapper接口的方法上添加@MapKey注解,这个时候就可以把每条数据转换的map集合作为值,以某一个字段的值作为键,放在同一个map集合中