MyBatis映射问题。

假设我们有一张表USERS

CREATE TABLE USERS(
   USER_ID int(10) NOT NULL AUTO_INCREMENT,
   LOGIN varchar(100) NOT NULL,
   EMAIL varchar(255),
   SALARY int(10),
   AVG_SCORE int(10),
   PRIMARY KEY ( USER_ID )
);


有3个POJO类-

public class User {
    private Long id;
    private String login;
    private String email;

...getters/setters
}


还有两个扩展User的类

public class Student extends User {
    private Integer score;
...getters/setters
}

public class Teacher extends User {
    private Integer salary;
...getters/setters
}


和一个映射器(我使用XML,但实际上没关系)。

<select id="selectAll" resultMap="<dynamicResultMapHere>">
    SELECT * FROM USERS
    <some conditions here>
</select>


我想获取List<Teacher>List<Student>实例,具体取决于SALARY列是否为空。

如何添加动态结果填充?

实际上,情况更为复杂。我以某种方式需要根据查询参数返回不同的结果。

最佳答案

检查关于鉴别符的documentation
对于resultMapStudent的特定字段,将需要一个Teacher,对于resultMap(对于公共字段),该User将引用一个<discriminator>和部分。

可能需要一个伪列:

SELECT (CASE WHERE salary IS NULL THEN 1 ELSE 2 END) AS userType


接着

<discriminator javaType="int" column="userType">
    <case value="1" resultMap="studentResultMap" />
    <case value="2" resultMap="teacherResultMap" />
</discriminator>

10-01 19:03