2017-05-05 42 views
1

MyBatis映射问题。MyBatis动态ResultMap。如何返回不同POJO对象的列表?

假设我们有一个表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 
} 

和两个类扩展用户

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>实例。

如何添加动态结果填充?

其实这个情况比较复杂。我不知何故需要根据查询参数返回不同的结果。

回答

1

检查documentation鉴别器。 这将需要一个resultMapStudentTeacher特定字段resultMapUser(用于共同领域)和<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> 
+0

是否有可能有动态鉴别?我试图添加一个通用的方法https://github.com/StanislavLapitsky/mybatis-star-dao SelectAll接受表名并提供实体类的SelectAll。这意味着我没有固定数量的实体将它们列入'discriminator'区块。无论如何。感谢您的建议! – StanislavL

+0

看起来您正在绑定使用Mybatis创建ORM,而Mybatis是SQL映射器,而不是ORM。任何JPA框架都可以给你想要实现的东西带来更加接近的答案:只需将java实体注释为映射表,然后CRUD操作就直截了当。 – blackwizard

+0

我正在尝试使用ORM和SQL映射器。我遇到了一些使用hibernate和MyBatis的项目,希望以某种方式合并它们。 – StanislavL

相关问题