mybatis查詢層次結構的資料
阿新 • • 發佈:2019-01-14
最近做了一個評論功能,一篇文章的評論資料的組成結構如下圖:
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中缺失的使用者暱稱資訊。