You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:37:33