最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis使用collection標簽進行樹形結構數(shù)據(jù)查詢時攜帶外部參數(shù)查詢

 更新時間:2023年10月02日 08:26:52   作者:StoneWu - 石頭日記  
這篇文章主要介紹了Mybatis使用collection標簽進行樹形結構數(shù)據(jù)查詢時攜帶外部參數(shù)查詢,需要的朋友可以參考下

1. 背景

最近更新博客的評論功能,想實現(xiàn)這么一個需求:

評論使用樹形結構展示,評論提交后,需要后臺審核后才展示到前臺,但是用戶自己可以顯示自己提交的未審核的評論

2. 實施

最初的實現(xiàn)方法是想使用collection進行樹形結構查詢

為了實現(xiàn)樹形查詢,需要兩個resultMap,一個為最外層的查詢結果,另一個是集合里的查詢結果,也就是對象中的children對應的List,因為是樹形結構,所以外層和里層的結構基本一樣,下方代碼為兩個resultMap代碼(示例):

    <resultMap type="com.stonewu.blog.core.entity.custom.ReplyTree" id="replyTree">
        <id column="id" property="id"/>
        <result column="content" property="content"/>
        <result column="article_id" property="articleId"/>
        <result column="author_id" property="authorId"/>
        <result column="parent_reply_id" property="parentReplyId"/>
        <result column="check_reply" property="checkReply"/>
        <collection column="id=id,authorId=author_id" property="children" ofType="com.stonewu.blog.core.entity.custom.ReplyTree" javaType="java.util.ArrayList" select="getReplyChildren">
        </collection>
    </resultMap>
    <resultMap type="com.stonewu.blog.core.entity.custom.ReplyTree" id="replyTreeChild">
        <id column="id" property="id"/>
        <result column="content" property="content"/>
        <result column="article_id" property="articleId"/>
        <result column="author_id" property="authorId"/>
        <result column="parent_reply_id" property="parentReplyId"/>
        <result column="check_reply" property="checkReply"/>
        <collection column="id=id,authorId=author_id" property="children" ofType="com.stonewu.blog.core.entity.custom.ReplyTree" javaType="java.util.ArrayList" select="getReplyChildren">
        </collection>
    </resultMap>

因為父查詢中,需要查出頂層的評論,所以parent_reply_id應該為null,同時為了查詢出自己評論的,但是未審核的,就需要下方<if test="param.authorId != null">的代碼

下方代碼為父查詢代碼(示例):

    <select id="findReplyTreeByParam" parameterType="com.stonewu.blog.core.entity.custom.ReplyTree"
            resultMap="replyTree">
        SELECT
        r.*, a.title article_title,
        m.nick_name author_name
        FROM
        reply r
        LEFT JOIN article a ON r.article_id = a.id
        LEFT JOIN menber m ON m.id = r.author_id
        WHERE 1 = 1
        <if test="param.id != null">
            AND a.id = #{param.id}
        </if>
        <if test="param.articleId != null">
            AND article_id = #{param.articleId}
        </if>
        <if test="param.topReplyId != null">
            AND top_reply_id = #{param.topReplyId}
        </if>
        AND parent_reply_id is null
        <if test="param.checkReply != null">
            AND ( check_reply = #{param.checkReply}
            <if test="param.authorId != null">
                or m.id = #{param.authorId}
            </if>
            )
        </if>
        <if test="param.replyType != null">
            AND reply_type = #{param.replyType}
        </if>
    </select>

子查詢是通過上面resultMap中的collection標簽關聯(lián)的getReplyChildren查詢,查詢語句最初寫的如下

    <select id="getReplyChildren" resultMap="replyTreeChild">
        SELECT
        r.*, a.title article_title,
        m.nick_name author_name
        FROM
        reply r
        LEFT JOIN article a ON r.article_id = a.id
        LEFT JOIN menber m ON m.id = r.author_id
        WHERE 1 = 1
        AND parent_reply_id = #{id}
        AND (
            check_reply = 1
            <if test="authorId != null">
                or m.id = #{authorId}
            </if>
        )
    </select>

最下方的if,里面的authorId并非是查詢的時候傳入的param.authorId,而是父查詢中的查詢結果的authorId,完全無法達到想要的效果

墻內(nèi)墻外搜了半天,最終發(fā)現(xiàn)唯一的解決辦法只有這種,在父查詢的時候,把當前傳的authorId參數(shù)作為查詢結果,放到select xxx from中,然后在collection標簽中用column屬性關聯(lián),可是這樣子resultMap就又要多一個列,實在是影響代碼維護,最終選擇放棄了這個方式

3、解決辦法 把所有的子對象都通過java進行拼裝,使用遞歸,手動執(zhí)行多次查詢,每次查詢即可攜帶自己想要的參數(shù)進行查詢,代碼示例如下:

   /**
     * 父查詢
     * @param page
     * @param param
     * @return
     */
    @Override
    @Cacheable(cacheResolver = BlogCacheConfig.CACHE_RESOLVER_NAME, key = "'findReplyTreeByParam_'+#param.articleId+'_'+#param.checkReply+'_'+#param.authorId+'_page_'+#page.current+'_'+#page.size")
    public Page<ReplyTree> findReplyTreeByParam(Page<ReplyTree> page, ReplyTree param) {
        Page<ReplyTree> result = mapper.findReplyResultByParam(page, param);
        getChildReply(new Page<>(1, 9999), param, result.getRecords());
        return result;
    }
    /**
     * 子查詢
     * @param page
     * @param param
     * @param result
     */
    private void getChildReply(Page<ReplyTree> page, ReplyTree param, List<ReplyTree> result) {
        result.forEach(replyTree -> {
            Integer id = replyTree.getId();
            param.setParentReplyId(id);
            Page<ReplyTree> childReply = mapper.findReplyResultByParam(page, param);
            replyTree.setChildren(childReply.getRecords());
            getChildReply(page, param, childReply.getRecords());
        });
    }

里面的findReplyResultByParam方法就跟普通的mybatis查詢一致,只需要傳入上級評論ID以及authorId即可,主要的邏輯就是在中間的遞歸,需要把每次查詢的結果放入上級評論的children中,搞定!

到此這篇關于Mybatis使用collection標簽進行樹形結構數(shù)據(jù)查詢時攜帶外部參數(shù)查詢的文章就介紹到這了,更多相關Mybatis使用collection查詢時攜帶外部參數(shù)查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java Chaos Game噪聲游戲實例代碼

    Java Chaos Game噪聲游戲實例代碼

    這篇文章主要介紹了Java Chaos Game噪聲游戲實例代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 探討Java驗證碼制作(上篇)

    探討Java驗證碼制作(上篇)

    很多朋友對驗證碼并不陌生,無論是申請賬號還是某些情況下登錄時都會要求輸入驗證碼。接下來通過本文給大家介紹java驗證碼制作的方法,感興趣的朋友一起學習吧
    2016-05-05
  • Java編寫日歷表的3種方式

    Java編寫日歷表的3種方式

    這篇文章主要為大家詳細介紹了Java編寫日歷表的3種方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java判斷各類型字符個數(shù)實例代碼

    java判斷各類型字符個數(shù)實例代碼

    大家好,本篇文章主要講的是java判斷各類型字符個數(shù)實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java?IO流之StringWriter和StringReader用法分析

    Java?IO流之StringWriter和StringReader用法分析

    這篇文章主要介紹了Java?IO流之StringWriter和StringReader用法分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JAVA基礎之一些不為人知的那些秘密

    JAVA基礎之一些不為人知的那些秘密

    一個 Java 程序可以認為是一系列對象的集合,而這些對象通過調用彼此的方法來協(xié)同工作,下面這篇文章主要給大家介紹了JAVA基礎之一些不為人知的那些秘密,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • SpringBoot使用ApplicationEvent&Listener完成業(yè)務解耦

    SpringBoot使用ApplicationEvent&Listener完成業(yè)務解耦

    這篇文章主要介紹了SpringBoot使用ApplicationEvent&Listener完成業(yè)務解耦示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 如何獲得spring上下文的方法總結

    如何獲得spring上下文的方法總結

    這篇文章主要介紹了如何獲得spring上下文的方法總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 你知道jdk竟有4個random嗎

    你知道jdk竟有4個random嗎

    這篇文章主要給大家介紹了關于jdk中4個random的相關資料,分別是Random、ThreadLocalRandom、SecureRandom以及SplittableRandom,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-06-06
  • 使用HttpClient實現(xiàn)文件的上傳下載方法

    使用HttpClient實現(xiàn)文件的上傳下載方法

    下面小編就為大家?guī)硪黄褂肏ttpClient實現(xiàn)文件的上傳下載方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論

抚远县| 商洛市| 莎车县| 土默特右旗| 珲春市| 陕西省| 大庆市| 武陟县| 肇东市| 海丰县| 淮阳县| 蒙山县| 陇川县| 济南市| 海南省| 临洮县| 平远县| 仙游县| 涟源市| 广东省| 墨玉县| 汶川县| 温州市| 普兰县| 万宁市| 永胜县| 湘潭县| 九寨沟县| 德保县| 绵竹市| 天全县| 泽普县| 千阳县| 彭山县| 三河市| 开远市| 连城县| 西和县| 谷城县| 襄汾县| 铜川市|