1. 程式人生 > >mybatis查詢層次結構的資料

mybatis查詢層次結構的資料

最近做了一個評論功能,一篇文章的評論資料的組成結構如下圖:
實體類關係圖
CommentBean和文章是一一對應的關係,一個CommentBean下可能有多條評論資料(CommentDetailBean),一條評論下又可能有多條回覆(ReplyDetailBean),做出評論和回覆的使用者資訊又來自另一張User的表。下面將使用mybatis從資料庫查詢出具有這樣層次結構的資料。

<select id="selectGoodsCommentWithReply" parameterType="String" resultMap="commentResult">
    SELECT temp.*, u2.u_nick u2_nick FROM (SELECT u1.u_nick u1_nick, u1.u_photo u1_photo, gc.gc_id,
           gc.gc_g_id, gcd.gcd_id, gcd.gcd_content, gcd.gcd_createTime, grd.grd_id, grd.grd_content,
           grd.grd_createTime, grd.grd_u_id
           FROM users u1, goodsComment gc, goodsCommentDetail gcd LEFT OUTER JOIN goodsReplyDetail grd
                                                   ON gcd.gcd_id = grd.grd_gcd_id
           WHERE gc.gc_g_id = #{g_id} AND gc.gc_id = gcd.gcd_gc_id AND u1.u_id = gcd.gcd_u_id
                                      ORDER BY gcd.gcd_createTime DESC) temp
              LEFT OUTER JOIN users u2 ON temp.grd_u_id = u2.u_id
</select>

<resultMap id="replyDetailResult" type="ReplyDetailBean">
    <id property="id" column="grd_id"/>
    <result property="nickName" column="u2_nick"/>
    <result property="content" column="grd_content"/>
    <result property="createTime" column="grd_createTime"/>
</resultMap>

<resultMap id="commentDetailResult" type="CommentDetailBean">
    <id property="id" column="gcd_id"/>
    <result property="nickName" column="u1_nick"/>
    <result property="userPhoto" column="u1_photo"/>
    <result property="content" column="gcd_content"/>
    <result property="createTime" column="gcd_createTime"/>
    <collection property="replyList" ofType="ReplyDetailBean" resultMap="replyDetailResult"/>
</resultMap>

<resultMap id="commentResult" type="CommentBean">
    <id property="id" column="gc_id"/>
    <result property="g_id" column="gc_g_id"/>
    <collection property="list" ofType="CommentDetailBean" resultMap="commentDetailResult"/>
</resultMap>

可以看到這裡定義了三個resultMap,分別代表了CommentBean、CommentDetailBean、ReplyDetailBean三個實體類的對映,在resultMap中使用collection來實現list的對映。

在查詢語句中,外層select嵌套了一層select。
內層select利用CommentDetailBean左外連線ReplyDetailBean,根據user表和CommentDetailBean相同的使用者id查詢出所有的評論和回覆資料,其中評論資料中已存入了使用者的暱稱和頭像資訊。
外層select利用ReplyDetailBean左外連線user,查詢出ReplyDetailBean中缺失的使用者暱稱資訊。