使用实体类
代码语言:javascript复制/**
* <p>
* 用户角色表
* </p>
*
* @author 朵橙i
* @since 2022-10-24
*/
@Getter
@Setter
@TableName("tb_user_role")
@ApiModel(value = "UserRole对象", description = "用户角色表")
public class UserRole implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键id")
@TableId(value = "ID",type = IdType.ASSIGN_ID)
private String id;
@ApiModelProperty("用户id")
@TableField("USER_ID")
private String userId;
@ApiModelProperty("角色id")
@TableField("ROLE_ID")
private String roleId;
@ApiModelProperty("是否删除 0否 1是")
@TableField(value = "IS_DELETE", fill = FieldFill.INSERT)
@TableLogic(value = "0", delval = "1")
private Integer isDelete;
}
进行操作
很明显这是一个中间表,我们现在有一个需求—> 我们要通过用户id查询出其所对应的所有的角色id,先看一下如果使用正常的情况下的逻辑处理
代码语言:javascript复制LambdaQueryWrapper<UserRole> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(UserRole::getUserId, userIds);
List<UserRole> list = list(queryWrapper);
Map<String, List<UserRole>> collect = list.stream().collect(Collectors.groupingBy(UserRole::getUserId));
// 还要把map的value去转换成list<String>可太麻烦了
如果我们使用Collections.mapping方法给groupBy传入一个下游流进行操作的话会方便很多 下面示例是通过SQ的Many实现的代码编写更加优雅
代码语言:javascript复制// 根据userIds查询出所有的角色
return Many.of(UserRole::getRoleId)
.in(userIds) // 使用Steam对结果进行操作
.query(steam // 根据userId分组然后list里边装有的是UserRole对象并不是我们想要的,我们只需要roleId
->
steam.group(UserRole::getUserId,
// 传入一个下游收集器将每个所对应的多个userId封装到list里边
Collective.mapping(UserRole::getUserId, Collectors.toList())));