在 MyBatis-Plus 中,可以通过多种方式排除部分字段,使其在查询时不返回。以下是几种常见的方法及其实现方式:
1. 使用 @TableField(exist = false)
注解
通过在实体类中使用 @TableField(exist = false)
注解,可以标记某个字段为非数据库字段,从而在查询时自动排除该字段。
示例代码:
@Data
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
@TableField(exist = false) // 标记为非数据库字段
private String excludedField;
}
说明:
- 这种方式适用于字段本身不在数据库中的情况。
- 查询时,
excludedField
不会被包含在 SQL 语句中。
2. 使用 QueryWrapper
的 select
方法
通过 QueryWrapper
的 select
方法,可以动态指定需要查询的字段,或者排除某些字段。
示例代码:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select(User.class, info -> !info.getColumn().equals("excludedField"));
List<User> userList = userMapper.selectList(queryWrapper);
说明:
- 这种方式适合需要动态排除字段的场景。
- 可以通过 Lambda 表达式灵活控制需要查询的字段。
3. 使用 LambdaQueryWrapper
的 select
方法
LambdaQueryWrapper
提供了更简洁的 Lambda 表达式写法,适合排除多个字段。
示例代码:
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(User.class, info ->
!info.getColumn().equals("excludedField1") &&
!info.getColumn().equals("excludedField2")
);
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
说明:
- 这种方式适合需要排除多个字段的场景。
- 代码可读性更高。
4. 自定义工具方法过滤字段
可以封装一个工具方法,动态排除不需要查询的字段。
示例代码:
public static <T> LambdaQueryWrapper<T> filterProperties(LambdaQueryWrapper<T> wrapper, SFunction<T, ?>... functions) {
Set<String> properties = Arrays.stream(functions)
.map(LambdaUtils::resolve)
.map(SerializedLambda::getImplMethodName)
.map(PropertyNamer::methodToProperty)
.collect(Collectors.toSet());
return wrapper.select(i -> !properties.contains(i.getProperty()));
}
// 使用示例
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
filterProperties(wrapper, User::getExcludedField1, User::getExcludedField2);
List<User> userList = userMapper.selectList(wrapper);
说明:
- 这种方式适合需要复用字段过滤逻辑的场景。
- 通过工具方法简化代码。
5. 检查字段映射配置
如果查询结果中某些字段为 null
,可能是字段映射配置问题。确保实体类字段名与数据库列名一致,或者开启驼峰命名转换。
示例配置:
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
说明:
- 如果数据库列名是下划线格式(如
user_name
),实体类字段名应为驼峰格式(如userName
)。
总结
- 如果需要排除非数据库字段,使用
@TableField(exist = false)
。 - 如果需要动态排除字段,使用
QueryWrapper
或LambdaQueryWrapper
的select
方法。 - 如果需要复用字段过滤逻辑,可以封装工具方法。
- 确保字段映射配置正确,避免查询结果字段为
null
。
根据具体需求选择合适的方式即可。如果需要更详细的代码示例或进一步优化,可以参考相关文档或示例代码。