# 注解方式关联查询
从 2.1.3 版本开始,支持通过注解的方式自动完成关联查询映射,无需手动调用 oneToOneSelect 或 manyToManySelect 方法。
支持三种注解:
@OneToOne:一对一关联映射@ManyToMany:一对多/多对多关联映射@FieldTrans:字段翻译映射
# 使用说明
# 注解定义位置
重要:注解需要定义在响应实体类中,而不是 MP 实体类中。
例如,如果查询返回的是 UsersVo.class,那么注解就应该定义在 UsersVo 类中,而不是 Users MP 实体类中。
# 基础用法
使用方式与普通查询完全一致,只需要在响应实体类中定义相应的注解即可:
List<Users> users = Joins.of(Users.class)
                .joinList(Users.class);
# @OneToOne 一对一关联
用于映射一对一的关系,比如一个用户对应一个年龄信息。
# 注解属性
targetSub: 目标子表类对应的MP实体 Class(必填)targetSubId: 目标子表类的主键字段名,默认为 targetSub 实体中的主键ref: 映射到响应实体类中的哪个字段(必填)
# 使用示例
public class UsersVo {
    
    private Long userId;
    
    private String userName;
    
    
    // 一对一映射:将 UsersAge 映射到 usersAge 字段
    @OneToOne(targetSub = UsersAge.class, ref = "usersAge")
    private Long ageId;
    
    // 接收映射结果的字段
    @TableField(exist = false)
    private UsersAge2 usersAge;
}
# 查询调用
List<UsersVo> users = Joins.of(Users.class)
        .joinList(UsersVo.class);
查询完成后,usersAge 字段会自动填充数据。
# @ManyToMany 一对多/多对多关联
用于映射一对多或多对多的关系,比如一个年龄类型对应多个用户。
# 注解属性
targetSub: 目标子表类对应的MP实体 Class(必填)targetSubId: 目标子表类的主键字段名,默认为 targetSub 实体中的主键ref: 映射到响应实体类中的哪个字段(必填)
# 使用示例
public class UsersVo {
    
    private Long userId;
    
    private String userName;
    
    
    // 一对多映射:将多个 UsersAge 映射到 usersAges 字段
    @ManyToMany(targetSub = UsersAge.class, ref = "usersAges")
    private Long ageId;
    
    // 接收映射结果的字段(List 类型)
    @TableField(exist = false)
    private List<UsersAge2> usersAges;
}
# 查询调用
List<UsersVo> users = Joins.of(Users.class)
        .joinList(UsersVo.class);
查询完成后,usersAges 字段会自动填充对应的 UsersAge 对象列表。
# @FieldTrans 字段翻译映射
用于将关联表中的字段值映射到当前实体类的不同字段中,实现字段翻译功能。
# 注解属性
targetSub: 目标子表类对应的实体 Class(必填)targetSubId: 目标子表类的主键字段名,,默认为 targetSub 实体中的主键tagetFiledOrRef: 字段映射配置数组,格式为{"源字段名:目标字段名"}(必填)
# 使用示例
public class UsersVo {
    
    private Long userId;
    
    private String userName;
    
    
    // 字段翻译:将 UsersAge 表中的 ageName 字段映射到 ageNames,ageDoc 映射到 ageDocs
    @FieldTrans(
        targetSub = UsersAge.class,
        tagetFiledOrRef = {"ageName:ageNames", "ageDoc:ageDocs"}
    )
    private Long ageId;
    
    // 接收翻译结果的字段
    @TableField(exist = false)
    private String ageNames;
    
    @TableField(exist = false)
    private String ageDocs;
}
# 查询调用
List<UsersVo> users = Joins.of(Users.class)
        .joinList(UsersVo.class);
查询完成后,ageNames 和 ageDocs 字段会自动填充对应的翻译值。
# 组合使用示例
可以在同一个实体类中同时使用多个注解:
public class UsersVo {
    
    private Long userId;
    
    private String userName;
    
    private Long ageId;
    
    // 一对一映射
    @OneToOne(targetSub = UsersAge.class, ref = "usersAge")
	 // 一对多映射
    @ManyToMany(targetSub = UsersAge.class, ref = "usersAges")
	  // 字段翻译映射
    @FieldTrans(
        targetSub = UsersAge.class,
        tagetFiledOrRef = {"ageName:ageNames", "ageDoc:ageDocs"}
    )
    private Long ageId;
    
    // 接收映射结果的字段
    @TableField(exist = false)
    private UsersAge2 usersAge;
    
    @TableField(exist = false)
    private List<UsersAge2> usersAges;
    
    @TableField(exist = false)
    private String ageNames;
    
    @TableField(exist = false)
    private String ageDocs;
}
# 嵌套映射
如果翻译的映射对象中又定义了翻译映射,那么也会一起查询出来。
例如,UsersAge2 中还定义了 UsersVo 的映射:
public class UsersAge2 {
    
    // UsersAge2 中又定义了 UsersVo 的映射
    @OneToOne(targetSub = UsersVo.class, ref = "usersVo")
    private Long id;
    
    private String ageDoc;
    
    private Date createTime;
    
    // 接收嵌套映射的结果
    @TableField(exist = false)
    private UsersVo2 usersVo;
}
当查询 UsersVo 时,如果 UsersVo 中定义了 UsersAge2 的映射,那么 UsersAge2 中的 UsersVo2 也会自动填充。
# 支持的查询方法
注解方式支持所有标准的查询方法:
joinList(Class<V> clazz): 查询列表joinPage(Page<Users> page, Class<V> clazz): 分页查询joinGetOne(Class<V> clazz): 查询单个
使用方式完全一致,只需确保注解定义在正确的响应实体类中即可。
← xxIfNull使用 用法注意 →
