Mybatis QueryWrapper.select() 查询字段返回null的问题

问题背景

在使用QueryWrapper.select()查询指定字段的时候,发现某些字段返回值为null。而这些字段在Bean中的名称和在数据库中的名称不一致。

查询代码如下。

1
2
3
4
5
6
7
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
//指定查询的字段
wrapper.select("employee_id", "last_name", "salary")
.eq("first_name", "chen");

List<Employee> employees = employeeMapper.selectList(wrapper);
log.debug(String.valueOf(employees));

Employee代码

1
2
3
4
5
6
7
8
9
10
public class Employee {
// @TableId 用于设置主键的一些信息
@TableId(value = "employee_id")
private Integer id;
private String firstName;
private String lastName;
private String email;
private double salary;
private int departmentId;
}

数据库字段

image-20220211222820715

查询结果:

image-20220211223423087

可以看到,Employee中的id字段和数据库中的employee_id字段不一致。这就导致了使用QueryWrapper.select()查询结果为null的问题。

问题原因

根据 queryWrapper使用.select时,id字段为null · Issue #3673 · baomidou/mybatis-plus (github.com) 可知。

在使用QueryWrapper.select()时,@TableId(value = "employee_id")是无效的。所以造成了名称映射错误,从而返回了null。

解决方法

select中添加转化语句,将查询代码改成下面样式,即可解决问题

1
2
3
4
5
6
7
QueryWrapper<Employee> wrapper = new QueryWrapper<>()e
//将 employee_id 改为 employee_id as id
wrapper.select("employee_id as id", "last_name", "salary")
.eq("first_name", "chen");

List<Employee> employees = employeeMapper.selectList(wrapper);
log.debug(String.valueOf(employees));

查询结果

image-20220211223512095