<select id="findByRoleId" parameterType="int" resultType="com.itheima.pojo.Permission">
        select p.* from t_permission p,t_role_permission rp where p.id = rp.permission_id and rp.role_id = #{role_id}
    </select>

下面是换一种写法,内联接

使用内联接将上述SQL语句转换为:
```

SELECT p.*
FROM t_permission p 
INNER JOIN t_role_permission rp ON p.id = rp.permission_id 
WHERE rp.role_id = #{role_id}


``` 
使用INNER JOIN代替WHERE子句中的等于号是内联接的常见写法。它会将操作拆分成两个部分:一部分(INNER JOIN语句)是通过连接表中的列组合而成的新表,而另一部分(WHERE语句)则在新表上应用额外的筛选条件。INNER JOIN和WHERE子句都可以过滤掉原表中的行,但INNER JOIN通常在处理多个表时更为高效。

可以使用Mybatis-Plus提供的QueryWrapper来构建内联接的SQL语句,如下所示:
```

QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.select("t_permission.*")
        .from("t_permission")
        .innerJoin("t_role_permission on t_permission.id = t_role_permission.permission_id")
        .eq("t_role_permission.role_id", role_id);
List<Permission> permissions = permissionService.list(queryWrapper);


```
以上代码中,我们首先初始化一个QueryWrapper对象,然后通过select方法指定查询的字段,接着使用from方法指定查询的表,再使用innerJoin方法指明内联连接的表及其连接条件。最后,我们使用eq方法查询符合指定条件的结果,并通过permissionService.list(queryWrapper)方法返回查询结果。

使用Lambda表达式将上述QueryWrapper转换为LambdaQueryWrapper可以这样写:
```

LambdaQueryWrapper<Permission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(Permission.class, i -> i.getColumn().startsWith("t_permission"))
        .inSql(Permission::getId, "SELECT permission_id from t_role_permission WHERE role_id=" + role_id);
List<Permission> permissions = permissionService.list(lambdaQueryWrapper);


```
其中,我们创建了一个LambdaQueryWrapper对象,并通过select方法选择查询的字段,第二个参数是一个Lambda表达式,用来过滤列对象。接着,我们使用inSql方法,在LambdaQueryWrapper中嵌入SQL语句,实现了内联连接的查询。最后,我们将LambdaQueryWrapper对象传递给permissionService.list方法,得到查询结果。请注意,在这个示例中,我们使用了inSql方法而不是eq方法,因为这里需要使用内联连接的子查询。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐