QueryWrapper 无法识别注解 @Ignore问题
在实体类中,有时会为了业务需求而引入别的类作为属性值。
此时就要添加@Ignore
注解,如下所示。使用该注解的属性会被 MyBatis-Plus 在执行数据库操作时忽略。这意味着其不会参与任何 INSERT 或 UPDATE 操作,也不会在 SELECT 查询中被映射。
@TableName("user")
public class User {
// 主键id 自增
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "uid")
private String uid;
@TableField(value = "name")
private String name;
// 引入course类
@Ignore
private course userCourse;
}
但当我们使用QueryWrapper
进行查询时:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("uid", uid);
List<User> userList = userMapper.selectList(queryWrapper);
会发现,QueryWrapper
并不识别@Ignore
注解,并将userCourse
视作数据库中的一列,从而报错列名'user_course' 无效
。
为了解决这个问题,我们需要在构建QueryWrapper
时手动排除userCourse
字段,如下所示。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("uid", uid);
queryWrapper.select(User.class, info -> !info.getColumn().equals("user_course"));
List<User> userList = userMapper.selectList(queryWrapper);
这样就可以忽略userCourse
属性,实现正常的查询。
注意:报错为
user_course
,且我们去除元素时也设定去除字段为user_course
,而非userCourse
。这是因为 MyBatis-Plus 会根据默认映射,在 Java 属性名和数据库列名之间进行转换。