[TOC]
*****
# 6.1.3 鉴别器查询
有时一个查询会根据列的值不同返回不同的结果集。
**例子:** 角色的属性enable值为1的时候表示状态可用,为0的时候表示状态不可用。enable=1时可以获取到该角色下详细的权限信息。 当enable=0时只能获取角色的基息。
**1. 在SysRole.java中**
```
package tk.mybatis.simple.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import tk.mybatis.simple.type.Enabled;
/**
* 角色表
*/
public class SysRole implements Serializable {
private static final long serialVersionUID = 6320941908222932112L;
/**
* 角色ID
*/
private Long id;
/**
* 角色名
*/
private String roleName;
private int enabled;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 用户信息
*/
private SysUser user;
/**
* 角色包含的权限列表
*/
List<SysPrivilege> privilegeList;
}
```
**2 在RoleMapper.java中**
```
/**
* 根据用户 ID 获取用户的角色信息
*
* @param userId
* @return
*/
//xml中的sql用#{userId}从方法的入参取值
List<SysRole> selectRoleByUserIdChoose(Long userId);
```
**3. 在RoleMapper.xml中**
```
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="tk.mybatis.simple.mapper.RoleMapper">
<cache/>
<!-- 基础映射 -->
<resultMap id="roleMap" type="tk.mybatis.simple.model.SysRole">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="enabled" column="enabled"/>
<!-- <association property="createInfo" javaType="tk.mybatis.simple.model.CreateInfo"> -->
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>
<resultMap id="rolePrivilegeListMapSelect" extends="roleMap" type="tk.mybatis.simple.model.SysRole">
<collection property="privilegeList"
fetchType="lazy"
select="tk.mybatis.simple.mapper.PrivilegeMapper.selectPrivilegeByRoleId"
column="{roleId=id}"/>
</resultMap>
<!--3 鉴别器查询,根据返回的值不同,选择不同的映射结果-->
<resultMap id="rolePrivilegeListMapChoose" type="tk.mybatis.simple.model.SysRole">
<discriminator column="enabled" javaType="int">
<!-- 根据sql查询出的enabled-->
<case value="1" resultMap="rolePrivilegeListMapSelect"/>
<case value="0" resultMap="roleMap"/>
</discriminator>
</resultMap>
<!--3 鉴别器查询,根据返回的值不同,选择不同的映射结果-->
<select id="selectRoleByUserIdChoose" resultMap="rolePrivilegeListMapChoose">
select
r.id,
r.role_name,
r.enabled,
r.create_by,
r.create_time
from sys_role r
inner join sys_user_role ur on ur.role_id = r.id
where ur.user_id = #{userId}
</select>
</mapper>
```
javaType: 该属性用于指定列的类型, 保证使用相同的Java类型来比较值
**4 在RoleMapperTest.java中**
```
public class RoleMapperTest extends BaseMapperTest{
@Test
public void testSelectRoleByUserIdChoose(){
//获取 sqlSession
SqlSession sqlSession = getSqlSession();
try {
//获取 RoleMapper 接口
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
//由于数据库数据 enable 都是 1,所以我们给其中一个角色的 enable 赋值为 0
SysRole role = roleMapper.selectById(2L);
role.setEnabled(0);
roleMapper.updateById(role);
//获取用户 1 的角色
List<SysRole> roleList = roleMapper.selectRoleByUserIdChoose(1L);
for(SysRole r: roleList){
System.out.println("角色名:" + r.getRoleName());
if(r.getId().equals(1L)){
//第一个角色存在权限信息
Assert.assertNotNull(r.getPrivilegeList());
} else if(r.getId().equals(2L)){
//第二个角色的权限为 null
Assert.assertNull(r.getPrivilegeList());
continue;
}
for(SysPrivilege privilege : r.getPrivilegeList()){
System.out.println("权限名:" + privilege.getPrivilegeName());
}
System.out.println();
}
} finally {
sqlSession.rollback();
//不要忘记关闭 sqlSession
sqlSession.close();
}
}
}
```
![](https://box.kancloud.cn/f9fd82f14b6fe7e17d9bfe381d7351c0_504x668.png)
![](https://box.kancloud.cn/3c1e3c5f6f2e77d9422da53c8d6f7961_455x170.png)
**5 鉴别器的其他使用方法**
![](https://box.kancloud.cn/51e836d4893cd11baa1978b6e4ac4f69_930x554.png)