搜尋

首頁  >  問答  >  主體

java - Mybatis 一對多怎麼映射

例如有一個實體類別

public class AnswerDto{ //一个回复的类,一个问题可能会有多个回复
    int id;
    int askId;//问题id
    List<String> answers; //回复的列表
}

#我原本這麼寫,但是錯的 T0T, 應該要如何將content映射到List<String>

<select id="getAns" parameterType="int" resultMap="uiy">
    select
    id, 
    ask_id AS "askId",
    content
    from t_answer where ask_id = #{_parameter}
</select>

<resultMap type="AnswerDto" id="uiy">
    <id property="id" column="id"/>
    <result property="askId" column="askId" />
    <collection property="ls" ofType="string">
        <constructor>
            <arg column="content"/>
        </constructor>
    </collection>
</resultMap>
曾经蜡笔没有小新曾经蜡笔没有小新2789 天前596

全部回覆(3)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-05-17 10:09:25

    mybatis是根據<id>標籤確定集合映射關係的, 如果一定要用你這個表的話可以這樣映射

    <id column="askId" property="askId" />
    <result column="id" property="id"/>
    <collection property="answers" ofType="java.lang.String" javaType="java.util.List">
        <result column="content" />
    </collection>

    回覆
    0
  • ringa_lee

    ringa_lee2017-05-17 10:09:25

    樓主這裡應該還少了一張表,就是問題表。

    配合問題表,DTO的定義應該是這樣的。

    public class QuestionDTO {
         int questionId;
         String questionDesc;
         List<AnswerDTO> answers; // Answers of the question
         int created; // 创建时间
         int updated; // 更新时间
    }
    
    public class AnswerDTO{ //一个回复的类,一个问题可能会有多个回复
        int id;
        int questionId; // 问题id
        String content; // 答案内容
        int created; // 创建时间
        int updated; // 更新时间
    }

    這個時候 mybatis 的關聯查詢解決方案有很多,我附上一個連結吧。

    Mybatis關聯查詢(巢狀查詢)

    mybatis 的關聯查詢網路資料蠻多的,樓主可以多搜搜。

    最後提一個建議,最好不要進行關聯查詢。資料的組裝邏輯放在程式碼裡面來做,這樣方便以後 DB 的改造。因為隨著資料量越來越大,關聯查詢效能比較糟糕,還不容易做分庫分錶的改造,不過這都是建立在業務有大量成長的情況下。當前的話,樓主開始培養這個意識就好啦。

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-17 10:09:25

    表格欄位到複雜物件欄位的對應可以採用自訂TypeHandler的方式搞定。
    eg:
    MyBatis裡json型欄位到Java類別的對應
    http://www.cnblogs.com/watery...

    回覆
    0
  • 取消回覆