文章目录
- 内连接
- JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper对象有啥区别?
- LambdaQueryWrapper 和 QueryWrapper的区别?
- LambdaQueryWrapper和MPJLambdaQueryWrapper的区别?
- 在作单表更新时建议使用:LambdaUpdateWrapper
- MPJLambdaWrapper和MPJLambdaQueryWrapper的区别?
- 三表联查的情况
- 做删除操作时
内连接
代码:
MPJLambdaWrapper<ToolsMenu> menuJoinWrapper = JoinWrappers.lambda("m1",ToolsMenu.class);//这里的m1 表示inner join 前面的表的别名
menuJoinWrapper.selectAll(ToolsMenu.class,"m1");
menuJoinWrapper.innerJoin(ToolsMenu.class,"m2",ToolsMenu::getMenuId,ToolsMenu::getMenuParentId);//这里的m2 表示inner join 后面的表的别名
menuJoinWrapper.eq("m2",ToolsMenu::getMenuCode, "tenantManagement");
final List<ToolsMenu> list = this.list(menuJoinWrapper);
解析后的SQL语句如下:
SELECT
m1.MENU_ID,
m1.menu_code,
m1.menu_name,
m1.menu_describe,
m1.menu_parent_id,
m1.menu_type,
m1.create_date,
m1.update_date,
m1.menu_order,
m1.menu_url,
m1.dir_or_menu,
m1.is_show,
m1.create_user,
m1.update_user
FROM
TOOLS_MENU m1
INNER JOIN TOOLS_MENU m2 ON ( m2.MENU_ID = m1.menu_parent_id )
WHERE
( m2.menu_code = ? )
其他的左连接,右连接类似上面的写法。
JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper对象有啥区别?
MPJLambdaWrapper<ToolsLogin> wrapper = new MPJLambdaWrapper<ToolsLogin>();
MPJLambdaWrapper<ToolsLogin> wrapper = JoinWrappers.lambda(ToolsLogin.class);
LambdaQueryWrapper 和 QueryWrapper的区别?
LambdaQueryWrapper和MPJLambdaQueryWrapper的区别?
在作单表更新时建议使用:LambdaUpdateWrapper
LambdaUpdateWrapper<KldModel> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(KldModel::getOwnId, id).set(KldModel::getIsDelete, 1);
kldModelService.update(wrapper);
优点:1.可以指定更新的where条件,2.可以通过特有的set方法有针对性只更新某一个或多个字段
MPJLambdaWrapper和MPJLambdaQueryWrapper的区别?
举例:
userJoinWrapper.select(ToolsUser::getUserId,ToolsUser::getUserName,
ToolsUser::getSex,ToolsUser::getEmpId,
ToolsUser::getPhoneNumber,ToolsUser::getRoleCode)
.select(ToolsTenantUserRelation::getTenantUserRelationId);
// .selectAs(ToolsTenantUserRelation::getTenantUserRelationId,"tenantUserRelationId");//也可以给字段起别名
userJoinWrapper.leftJoin(ToolsTenantUserRelation.class,ToolsTenantUserRelation::getUserId,ToolsUser::getUserId);
userJoinWrapper.eq(ToolsTenantUserRelation::getTenantId, tenantId);
对应的SQL:
SELECT
t.USER_ID,
t.user_name,
t.sex,
t.emp_id,
t.phone_number,
t.role_code,
t1.TENANT_USER_RELATION_ID
FROM
TOOLS_USER t
LEFT JOIN TOOLS_TENANT_USER_RELATION t1 ON ( t1.user_id = t.USER_ID )
WHERE
( t1.tenant_id = ? )
//这样可以查到不同表里的字段,此时使用MPJLambdaQueryWrapper就不行,必须使用MPJLambdaWrapper来复杂关联查询。
三表联查的情况
MPJLambdaWrapper<ToolsUser> userJoinWrapper= JoinWrappers.lambda();
userJoinWrapper.select(ToolsUser::getUserId,ToolsUser::getUserName,
ToolsUser::getSex,ToolsUser::getEmpId,
ToolsUser::getPhoneNumber,ToolsUser::getRoleCode)
.select(ToolsRole::getRoleName)
.select(ToolsTenantUserRelation::getTenantUserRelationId);
// .selectAs(ToolsTenantUserRelation::getTenantUserRelationId,"tenantUserRelationId");//也可以给字段起别名
userJoinWrapper.leftJoin(ToolsRole.class,ToolsRole::getRoleCode,ToolsUser::getRoleCode);
userJoinWrapper.leftJoin(ToolsTenantUserRelation.class,ToolsTenantUserRelation::getUserId,ToolsUser::getUserId);
userJoinWrapper.eq(ToolsTenantUserRelation::getTenantId, tenantId);
对应的SQL语句如下:
SELECT
t.USER_ID,
t.user_name,
t.sex,
t.emp_id,
t.phone_number,
t.role_code,
t1.role_name,
t2.TENANT_USER_RELATION_ID
FROM
TOOLS_USER t
LEFT JOIN TOOLS_ROLE t1 ON ( t1.role_code = t.role_code )
LEFT JOIN TOOLS_TENANT_USER_RELATION t2 ON ( t2.user_id = t.USER_ID )
WHERE
( t2.tenant_id = 1 )
LIMIT 10
这样可以把role_tool、tools_tenant_user_relation、tools_user表里的想要的数据都可以返回了。
做删除操作时
// DeleteJoinWrapper<ToolsLogin> deleteQuery = JoinWrappers.delete(ToolsLogin.class); //推荐的方式(首推)
// LambdaQueryWrapper<ToolsLogin> deleteQuery = new LambdaQueryWrapper<>(); //不推荐,但是也可以
MPJLambdaWrapper<ToolsLogin> deleteQuery = new MPJLambdaWrapper<>();//推荐的方式
deleteQuery.lt(ToolsLogin::getExpireTime, expireTime.getTime());
loginService.remove(deleteQuery);
但是需要注意一点的是:在做删除时,千万注意不要添加以下的内容:
// deleteQuery.select();//可能是在其他地方拷贝过来的。注意一定要删掉
// deleteQuery.selectAll();//可能是在其他地方拷贝过来的 。注意一定要删掉
所以建议使用DeleteJoinWrapper做删除,因为它里面不涉及select或者selectAll方法,因为它是专为做删除定制的。