SELECT
p.id AS id,
p.`name` AS `name`,
p.keyword AS keyword,
p.description AS description,
rp.role_id AS roleId
FROM
t_role_permission AS rp
INNER JOIN
t_permission AS p
ON
rp.permission_id = p.id
WHERE
rp.role_id = 1 写一个querywrapper,要求返回定制的DTO对象,这个对象包含这五个参数
QueryWrapper<RolePermission> queryWrapper = new QueryWrapper<>();
queryWrapper.select("t_permission.id as id", "t_permission.name as name",
"t_permission.keyword as keyword", "t_permission.description as description",
"t_role_permission.role_id as roleId")
.eq("role_id", 1)
.join("t_permission", "t_permission.id = t_role_permission.permission_id")
.groupBy("t_permission.id");
List<CustomDTO> resultList = rolePermissionMapper.selectList(queryWrapper).stream().map(entity -> {
CustomDTO dto = new CustomDTO();
dto.setId(entity.getId());
dto.setName(entity.getName());
dto.setKeyword(entity.getKeyword());
dto.setDescription(entity.getDescription());
dto.setRoleId(entity.getRoleId());
return dto;
}).collect(Collectors.toList());
```
在此,我们用到了两个表的关联查询,使用`join`方法完成,而且我们使用了`select`方法来指定需要查询的列,这样就可以避免不必要的列也被查询出来。最后,我们使用stream和lambda表达式来将每个`RolePermission`对象转化为对应的`CustomDTO`对象,最终将结果封装为`List`返回给调用者。
如果您使用MyBatis的XML配置方式,可以尝试以下的映射器配置代码:```xml
<!-- RolePermissionMapper.xml -->
<mapper namespace="com.example.mapper.RolePermissionMapper">
<!-- 定义结果集映射 -->
<resultMap id="customDTOMap" type="com.example.dto.CustomDTO">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="keyword" column="keyword"/>
<result property="description" column="description"/>
<result property="roleId" column="roleId"/>
</resultMap>
<!-- 定义查询语句 -->
<select id="selectRolePermissionsByRoleId" resultMap="customDTOMap">
SELECT t_permission.id, t_permission.name, t_permission.keyword, t_permission.description, t_role_permission.role_id as roleId
FROM t_role_permission
JOIN t_permission ON t_permission.id = t_role_permission.permission_id
WHERE t_role_permission.role_id = #{roleId}
GROUP BY t_permission.id
</select>
</mapper>
```
其中,定义了一个名为`customDTOMap`的结果集映射,针对`CustomDTO`类型中的属性做了对应关系的映射。在`selectRolePermissionsByRoleId`查询语句中,使用`JOIN`关键字实现了`RolePermission`表和`Permission`表的关联,并且使用`GROUP BY`关键字对`t_permission.id`列进行分组。最终,映射出的结果集为`customDTOMap`,返回类型为`CustomDTO`对象列表。 这里的`#{roleId}`为动态参数,具体值会在执行查询的时候传入。
是的,如果您只想返回一个Map集合,可以简化映射器配置代码,不需要定义结果集映射。请尝试以下代码:```xml
<!-- RolePermissionMapper.xml -->
<mapper namespace="com.example.mapper.RolePermissionMapper">
<!-- 定义查询语句 -->
<select id="selectRolePermissionsByRoleId" resultType="java.util.Map">
SELECT t_permission.id, t_permission.name, t_permission.keyword, t_permission.description, t_role_permission.role_id as roleId
FROM t_role_permission
JOIN t_permission ON t_permission.id = t_role_permission.permission_id
WHERE t_role_permission.role_id = #{roleId}
GROUP BY t_permission.id
</select>
</mapper>
```
在这个映射器配置中,我们仍然使用`select`标签定义了一个查询语句,但是此时的`resultType`属性指定为`java.util.Map`类型,表示查询结果将会以Map集合形式返回。查询结果中,key为`id`、`name`、`keyword`、`description`、`roleId`,value为对应的列值。您可以根据需要调整查询语句,返回自己需要的数据。
如果您想直接返回一个 HashMap,则可以在映射文件中使用 `resultType="java.util.HashMap"` 来指定返回值类型。示例XML配置如下:
```xml
<select id="selectRolePermissionsByRoleId" parameterType="int" resultType="java.util.HashMap">
SELECT id, name, keyword, description, role_id AS roleId
FROM role_permission
WHERE role_id = #{roleId}
</select>
```
然后在Java代码中,使用 `selectOne` 方法执行上述查询语句,并将结果设置为 HashMap 类型的变量,示例代码如下:
```java
HashMap<String, Object> resultMap = sqlSession.selectOne("com.example.mapper.RolePermissionMapper.selectRolePermissionsByRoleId", 1);
```
这样可以直接返回一个 HashMap 类型的结果,其中键为表的列名,值为该列的值。注意,如果有多条查询结果会抛出异常,因为 `selectOne` 方法要求查询结果只有一条。如果查询结果可能返回多条,应该使用 `selectList` 方法。