- @TypeDiscriminator 注解等价于 <discriminator>,用于根据结果匹配不同条件决定使用哪个 SQL 映射配置
- @Case 是 @TypeDiscriminator 的子注解,用于在 @TypeDiscriminator 注解中定义不同情况下需要映射到哪个Java对象。
- @TypeDiscriminator 注解有以下属性:
属性 |
描述 |
column |
用于鉴别的列名 |
javaType |
指定鉴别列对应的Java类型。如果不指定,则根据方法参数类型自动推断。 |
jdbcType |
指定鉴别列对应的JDBC类型。如果不指定,则根据Java类型自动推断 |
typeHandler |
指定用于处理鉴别列值的 TypeHandler 这个属性值是类的完全限定名或者是一个类型处理器的实现, 或者是类型别名。 |
cases |
定义不同情况下需要映射到哪个Java对象,该属性是一个 Case的数组,可以有多个case。可以包含多个 @Case |
- @Case 有以下属性:
属性 |
描述 |
value |
表示该情况下鉴别列匹配的值 |
type |
表示需要映射到哪个Java对象 |
results |
用于指定SQL语句返回结果集的类型。该属性是一个 Result 的数组,可以包含多个 @Result |
constructArgs |
于指定构造函数参数列表。该属性是一个 Arg 数组。包含多个 @Args,可以由 @Results 指定 |
示例
public interface UserMapper(){
@Select(value="select id,name,role from user where id=#{id}")
@TypeDiscriminator(
javaType = String.class,
column = "role",
cases = {
@Case(
value = "teacher",
type = Teacher.class,
results = {
@Result(property = "id", column = "id"),
@Result(
property = "class",
column = "class",
many = @Many(select = "com.domain.mapper.TeacherMapper.getClassById"))
}
),
@Case(
value = "student",
type = Student.class,
results = {
@Result(property = "id", column = "id"),
}
),
}
)
Student findUserById(int id);
}
注
- @Case 注解可以有多个,每个 @Case 注解对应一种情况。
- 当使用 @TypeDiscriminator 注解时,MyBatis 会根据指定的列名和列值来选择对应的 Java 对象类型,并将查询结果映射为该类型的实例。如果没有匹配到任何一个 @Case,则会使用默认类型进行映射。因此,在使用 @TypeDiscriminator 时,必须至少定义一个默认类型或者包含所有可能情况的 @Case。