背景:User Role UserRole 3个表的关系
我现在的需求:查找出所有用户,并且把他的角色也显示出来
一个用户可以有多个角色,那么User: id,name, Role
1.User ResultMap
<!-- 注意groupBy属性 --> <resultMap id="user-result-map" class="com.mmblue.entity.system.User" groupBy="id"> <result property="id" column="USERID" nullValue="0"/> <result property="name" column="USERNAME" javaType="string" jdbcType="VARCHAR2" nullValue=""/> <result property="realName" column="REALNAME" javaType="string" jdbcType="VARCHAR2" nullValue=""/> <result property="password" column="PASSWORD" javaType="string" jdbcType="VARCHAR2" nullValue=""/> <result property="createTime" column="CREATETIME" javaType="string" jdbcType="VARCHAR2" nullValue=""/> <result property="enable" column="ISENABLE" javaType="int" jdbcType="INTEGER" nullValue="0"/> <!-- 解决N+1问题 --> <result property="roles" resultMap="role.roleMap"/> <!-- 重现N+1问题 <result property="roles" column="roleid" select="role.queryRoleForObject_id" /> --> </resultMap>
2.Role ResultMap
<resultMap id="roleMap" class="com.mmblue.entity.system.Role"> <result property="id" column="ROLEID" nullValue="0"/> <result property="name" column="ROLENAME" nullValue=""/> <result property="desp" column="ROLEDESP" javaType="string" jdbcType="VARCHAR2" nullValue=""/> <result property="logTime" column="logtime" javaType="java.util.Date" jdbcType="date"/> <result property="statu" column="statu" nullValue="0"/> </resultMap> <select id="queryRoleForObject_id" resultMap="role.roleMap" parameterClass="long" > select ROLEID,ROLENAME,ROLEDESP,logtime,statu from myivr_trole where roleId = #id# </select>
3.User SELECT
<sql id="sql_user_where">
select
u.userid,
u.username,
u.realname,
u.password,
u.createtime,
u.isenable,
r.roleid,
r.rolename,
r.roledesp,
r.logtime,
r.statu
from
myivr_tuser u inner join myivr_tuser_role ur
on u.userid = ur.user_id
inner join myivr_trole r on ur.role_id = r.roleid
<dynamic prepend="where">
<isNotEmpty property="id" prepend="and">
u.USERID = #id#
</isNotEmpty>
<isNotEmpty property="enable" prepend="and">
u.ISENABLE = #enable#
</isNotEmpty>
</dynamic>
</sql>
讲解问题重现:
<result property="roles" column="roleid" select="role.queryRoleForObject_id" />
这里用了select 属性,可以理解为一个抓取策略,会根据roleid去发一条SQL抓取,但是我现在需求是查询所有的用户
那么对应的roleid会有多个,那么就会发多条SQL
解决问题:
其实我用内连接已经查询出了用户、角色的全部信息,我在
<!-- 解决N+1问题 --> <result property="roles" resultMap="role.roleMap"/>
这个result中,再次关联一个resulMap然后用groupId去组合即可。