2017-05-05 1213 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