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。
对于resultMap
和Student
的特定字段,将需要一个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>