如何将“男”,“女”两个字段统计结果映射出来?
解决办法:
导入fastjson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
Dept实体类添加men ,women字段用于接收统计的数据
@Data
@NoArgsConstructor
@AllArgsConstructor
//使用Lombok注解来构建实体类
public class Dept {
private int did;
private String dname;
private String loc;
private List<Emp> emp;
/** 新建男性性别计数列*/
private int men;
/** 新建女性性别计数列*/
private int women;
}
接口
public interface CountMapper {
/**
* Description: 查询各部门男女人数
* date: 2022/11/22
*
* @param
* @Return Dept 部门信息
* @author: dsdg
* @since JDK 1.8
*/
List<Dept> findGender();
}
xml映射文件
<!--resultMap用于查询各部门男女人数-->
<resultMap id="baseMaps" type="com.golop.entity.Dept">
<result column="did" property="did"/>
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
<!--一下两列用于接收查询各部门男女人数-->
<result column="men" property="men"/>
<result column="women" property="women"/>
</resultMap>
<!--查询各部门男女人数-->
<select id="findGender" resultMap="baseMaps">
select d.did,
e.dept_id,
sum(case e.gender when '男' then 1 else 0 end) as men,
sum(case e.gender when '女' then 1 else 0 end) as women
from springboot.dept d
left join springboot.emp e
on d.did = e.dept_id
group by e.gender, d.did
</select>
补充:为了方便理解,就将统计男女人数字段加在Dept是实体类中,其实也可以新建单独的统计性别的实体类。该实体类中的成员可以设计成是sql语句中输出字段d.did,e.dept,men,women中的部分字段或者全部字段。此处的resultMap也其实也可以不加,直接用resultType
controller层
//请求映射地址/save
@GetMapping(value = "/findGender", produces = "text/html;charset=UTF-8")
//请求转发(设置当前操作的返回值字符串)
@ResponseBody
public String savess() {
List<Dept> gender = deptService.findGender();
for (Dept dept : gender) {
System.out.println(dept);
}
//根据需要使用fastjson将结果转换成json格式数据
String s = JSON.toJSONString(gender);
return s;
}
后台结果:
前台结果:通过fastjson将不需要的值为null的字段过滤