使用mybatis-mp的@Fetch加载数据时,如何添加动态Where条件仅加载type=1的角色?
解决方案
针对你的需求,适配mybatis-mp 1.5.8版本,有两种常用实现方式:
方式一:通过@Fetch注解添加全局过滤条件
直接在VO类的sysRole字段的@Fetch注解中添加condition参数,指定角色类型过滤规则,这样只要使用该VO查询,都会自动只加载type=1的角色:
@Data @ResultEntity(SysUser.class) public class SysUserVo { private Integer id; private String userName; private Integer roleId; @ResultEntityField(property = "password") private String pwd; // 添加condition参数,指定SysRole.type = 1 @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class, targetProperty = "id", condition = "type = 1") private SysRoleVo sysRole; }
查询代码无需修改,保持原有逻辑即可:
List<SysUserVo> list = QueryChain.of(sysUserMapper) .like(SysUser::getUserName, "ad") .returnType(SysUserVo.class) .list();
方式二:在查询链中动态添加关联过滤条件
如果需要仅在特定查询场景下过滤角色类型,可以在QueryChain中通过leftJoin关联SysRole表,并添加类型过滤条件,这样只有符合条件的角色会被加载,用户数据不受影响(角色不符合时sysRole为null):
List<SysUserVo> list = QueryChain.of(sysUserMapper) .like(SysUser::getUserName, "ad") // 左关联SysRole表,关联条件为角色ID匹配 .leftJoin(SysRole.class, SysRole::getId, SysUser::getRoleId) // 添加角色类型等于1的过滤条件 .and(SysRole::getType, 1) .returnType(SysUserVo.class) .list();
两种方式的区别
- 方式一:全局生效,所有使用该VO的查询都会自动过滤
type=1的角色,适合固定规则的场景。 - 方式二:仅当前查询生效,灵活度更高,适合需要动态调整过滤条件的场景。
内容的提问来源于stack exchange,提问作者dever
相关产品推荐
相关产品推荐

