概述
在Vo对象中,有时会用List<其他类属性> xxx来作为属性,这时需要嵌套查询
/**
* Vo,通过此对象封装角色以及角色对应的菜单id
* @author DELL
*/
@Data
@ToString
public class SysRoleMenuVo {
/**角色id*/
private Integer id;
/**角色名称*/
private String name;
/**角色备注*/
private String note;
/**角色对应的菜单id*/
private List<Integer> menuIds;
}
除menuIds外,其他数据可以通过自身表查询
<select id="findObjectById" resultMap="sysRoleMenuVo" parameterType="int">
select id,name,note from sys_roles where id = #{id}
</select>
但是需要查询List menuIds,故嵌套查询
需要注意的是property属性和Vo对象属性一致,column属性是sql嵌套查询的条件,即以id为查询条件的。
若是上面的条件与下面的属性名不一致可以使用别名
上面的查询中使用别名 role_nam as name
下面用 < result column=“role_name” property=“name”/>
<resultMap id="SysRoleMenuVo" type="com.cy.pj.common.vo.SysRoleMenuVo">
<collection property="menuIds" column="id" select="com.cy.pj.sys.dao.SysRoleMenuDao.findMenuIdsByRoleId">
</collection>
</resultMap>
为了体现功能模块划分,将嵌套查询的sql写到对应的xml中
通过角色id查询菜单id,且菜单id不止一个
<select id="findMenuIdsByRoleId" parameterType="int" resultType="int">
select menu_id from sys_role_menus where role_id = #{id};
</select>
经过一系列努力以为结束了,但是一测方法发现
id等于null
SysRoleMenuVo(id=null, name=总监, note=否则解决重点问题bug, menuIds=[8, 24, 25, 45, 119, 126, 127, 46, 115, 116, 117, 118, 47, 120, 128, 130, 48, 132])
原因是id需要查询,但是没有专门去做映射是没有值的
需要加上
< id column=“id” property=“id”/> property与类中属性一致,需要用到类的setter方法—亲测 column与嵌套查询的条件也就是主表有关,可以改 只需要主表使用别名就能改
<select id="findObjectById" resultMap="SysRoleMenuVo" parameterType="int">
select id ,name,note from sys_roles where id = #{id}
</select>
<resultMap id="SysRoleMenuVo" type="com.cy.pj.common.vo.SysRoleMenuVo">
<id column="id" property="id"/>
<collection property="menuIds" column="id" select="com.cy.pj.sys.dao.SysRoleMenuDao.findMenuIdsByRoleId">
</collection>
</resultMap>
最后
以上就是魁梧蛋挞为你收集整理的mysql一对多嵌套查询的全部内容,希望文章能够帮你解决mysql一对多嵌套查询所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复