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

Mybatis使用collection標(biāo)簽進(jìn)行樹(shù)形結(jié)構(gòu)數(shù)據(jù)查詢(xún)時(shí)攜帶外部參數(shù)查詢(xún)

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

1. 背景

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

評(píng)論使用樹(shù)形結(jié)構(gòu)展示,評(píng)論提交后,需要后臺(tái)審核后才展示到前臺(tái),但是用戶(hù)自己可以顯示自己提交的未審核的評(píng)論

2. 實(shí)施

最初的實(shí)現(xiàn)方法是想使用collection進(jìn)行樹(shù)形結(jié)構(gòu)查詢(xún)

為了實(shí)現(xiàn)樹(shù)形查詢(xún),需要兩個(gè)resultMap,一個(gè)為最外層的查詢(xún)結(jié)果,另一個(gè)是集合里的查詢(xún)結(jié)果,也就是對(duì)象中的children對(duì)應(yīng)的List,因?yàn)槭菢?shù)形結(jié)構(gòu),所以外層和里層的結(jié)構(gòu)基本一樣,下方代碼為兩個(gè)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>

因?yàn)楦覆樵?xún)中,需要查出頂層的評(píng)論,所以parent_reply_id應(yīng)該為null,同時(shí)為了查詢(xún)出自己評(píng)論的,但是未審核的,就需要下方<if test="param.authorId != null">的代碼

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

    <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>

子查詢(xún)是通過(guò)上面resultMap中的collection標(biāo)簽關(guān)聯(lián)的getReplyChildren查詢(xún),查詢(xún)語(yǔ)句最初寫(xiě)的如下

    <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并非是查詢(xún)的時(shí)候傳入的param.authorId,而是父查詢(xún)中的查詢(xún)結(jié)果的authorId,完全無(wú)法達(dá)到想要的效果

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

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

   /**
     * 父查詢(xún)
     * @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;
    }
    /**
     * 子查詢(xún)
     * @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查詢(xún)一致,只需要傳入上級(jí)評(píng)論ID以及authorId即可,主要的邏輯就是在中間的遞歸,需要把每次查詢(xún)的結(jié)果放入上級(jí)評(píng)論的children中,搞定!

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

相關(guān)文章

  • Java Chaos Game噪聲游戲?qū)嵗a

    Java Chaos Game噪聲游戲?qū)嵗a

    這篇文章主要介紹了Java Chaos Game噪聲游戲?qū)嵗a,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 探討Java驗(yàn)證碼制作(上篇)

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

    很多朋友對(duì)驗(yàn)證碼并不陌生,無(wú)論是申請(qǐng)賬號(hào)還是某些情況下登錄時(shí)都會(huì)要求輸入驗(yàn)證碼。接下來(lái)通過(guò)本文給大家介紹java驗(yàn)證碼制作的方法,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • Java編寫(xiě)日歷表的3種方式

    Java編寫(xiě)日歷表的3種方式

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

    java判斷各類(lèi)型字符個(gè)數(shù)實(shí)例代碼

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

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

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

    JAVA基礎(chǔ)之一些不為人知的那些秘密

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

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

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

    如何獲得spring上下文的方法總結(jié)

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

    你知道jdk竟有4個(gè)random嗎

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

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

    下面小編就為大家?guī)?lái)一篇使用HttpClient實(shí)現(xiàn)文件的上傳下載方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12

最新評(píng)論

建宁县| 岐山县| 沂水县| 阿图什市| 牙克石市| 永川市| 广昌县| 德庆县| 滨州市| 察哈| 渑池县| 历史| 察雅县| 桐城市| 确山县| 汽车| 辛集市| 右玉县| 南澳县| 如东县| 永定县| 开化县| 太和县| 横山县| 普兰县| 巴林右旗| 友谊县| 青冈县| 扎囊县| 新余市| 漳州市| 香港| 库伦旗| 临夏县| 芒康县| 沿河| 仪陇县| 栾城县| 平阳县| 石泉县| 衡水市|