queryWrapper 使用内联接返回定制dto对象(xml返回定制dto对象)

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` 方法。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值