MyBatis un-à-plusieurs liste imbriquée retourne l'ensemble de résultats et la gestion des problèmes de requête de pagination

Au cours des deux derniers jours, lors de l'assemblage de l'interface système d'origine, j'ai rencontré l'interface d'autorisation de menu personnel-rôle-back-end, qui n'a pas effectué l'opération de requête associée de la table liée. Obtenez les données que vous souhaitez en une seule fois

Le SQL simple table unique d'origine:

     <select id = "queryList" resultType = "com.framework.entity.SysRoleEntity"> 
        sélectionnez * dans l'ordre sys_role par role_id asc 
         < if test = "offset! = null and limit! = null"> 
            limit # {offset}, # {limit}
         </ if > 
    </select>

Modifiez la requête pour renvoyer un jeu de résultats pour une liste imbriquée (point clé: utilisez la balise de collection dans resultMap):

Notez que le resultType dans select est changé en resultMap

    <resultMap id = "BaseResultMap" type = "com.framework.entity.SysRoleEntity"> 
        <id column = "role_id" property = "roleId" jdbcType = "INTEGER"> </id> 
        <result column = "role_name" property = "roleName" jdbcType = "VARCHAR"> </result> 
        <result column = "remarque" property = "remarque" jdbcType = "VARCHAR"> </result> 
        <result column = "create_time" property = "createTime" jdbcType = " TIMESTAMP "> </result> 
        <collection property =" menuIdList "resultMap =" menuIdListMap "/> 
    </resultMap> 
    <resultMap id =" menuIdListMap "type ="java.lang.Long "> 
        <id column =" menu_id "property =" id "javaType =" Long "> </id> 
    </resultMap> 
     <select id =" queryList "resultMap =" BaseResultMap "> 
        select 
         r.role_id, 
         r.role_name, 
         r.remark, 
         r.create_time, 
         rm.menu_id 
        from sys_role r 
        left join sys_role_menu rm on r.role_id = rm.role_id 
        ordre par r.role_id asc
         < if test = "offset! = null et limit! = null "> 
            limit # {offset}, # {limit}
         </ if > 
    </select>

Maintenant, cela a pour effet de renvoyer une liste imbriquée dans le jeu de résultats

Mais en même temps, cela pose également un autre problème: le paramètre de pagination correspond à la limite après la jointure gauche. Ce n'est pas la limite de pagination que nous attendons uniquement pour la table principale, donc l'instruction sql doit être encore améliorée:

Utilisez la condition where pour traiter le paramètre de pagination comme un sous-ensemble de la requête, puis utilisez le mot clé IN pour atteindre (car le mot clé IN ne peut pas être utilisé dans la même instruction que la limite, vous devez donc créer une table temporaire)

résultat final sql:

     <select id="queryList" resultMap="BaseResultMap">
        select
         r.role_id,
         r.role_name,
         r.remark,
         r.create_time,
         rm.menu_id
        from sys_role r
        left join sys_role_menu rm on r.role_id=rm.role_id
         <where>
             <if test="offset != null and limit != null">
                 r.role_id IN (SELECT temp.role_id from (SELECT role_id FROM sys_role limit #{offset}, #{limit}) AS temp)
             </if>
         </where>
        order by r.role_id asc
        <!--<if test="offset != null and limit != null">
            limit #{offset}, #{limit}
        </if>-->
    </select>

 最终完成修改,发布测试,这里mark一下修改大致过程,希望能够帮助有需要的同学

Je suppose que tu aimes

Origine www.cnblogs.com/mobingfeng/p/12711168.html
conseillé
Classement