MyBatis 动态 ResultMap。如何return列出不同的POJO对象?
MyBatis dynamic ResultMap. How to return list of different POJO objects?
MyBatis 映射问题。
假设我们有 table 个用户
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
}
还有两个 类 扩展用户
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 列是否为空。
如何添加动态结果填充?
其实情况要复杂得多。我不知何故需要 return 不同的结果取决于查询参数。
检查 documentation 关于 鉴别器 。
对于 Student
和 Teacher
的特定字段,resultMap
需要 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>
MyBatis 映射问题。
假设我们有 table 个用户
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
}
还有两个 类 扩展用户
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 列是否为空。
如何添加动态结果填充?
其实情况要复杂得多。我不知何故需要 return 不同的结果取决于查询参数。
检查 documentation 关于 鉴别器 。
对于 Student
和 Teacher
的特定字段,resultMap
需要 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>