mybatis-plus MPJBaseMapper selectJoinOne 用法leftjoin一张表两次添加别名处理

InsteadOrderRespVO insteadOrderRespVO = insteadOrderMapper.selectJoinOne(InsteadOrderRespVO.class,
                new MPJLambdaWrapper<InsteadOrderDO>().selectAll(InsteadOrderDO.class)
                        .selectAs("user1.username", InsteadOrderRespVO::getAnalystName)
                        .leftJoin(AdminUserDO.class, "user1", AdminUserDO::getId, InsteadOrderDO::getAnalystId)
                        .selectAs("user2.username", InsteadOrderRespVO::getPublisherName)
                        .leftJoin(AdminUserDO.class, "user2",AdminUserDO::getId, InsteadOrderDO::getCustomerId)
                        .eq(InsteadOrderDO::getId, id));

这段代码使用了 MyBatis-Plus (MP) 和其扩展功能来从数据库中查询一个 InsteadOrderRespVO 对象。下面是逐行的中文解释:

  1. 创建查询结果对象:

    InsteadOrderRespVO insteadOrderRespVO =
    

    这里创建了一个新的 InsteadOrderRespVO 实例,该实例将被填充从数据库获取的数据。

  2. 调用查询方法:

    insteadOrderMapper.selectJoinOne(
    

    调用 insteadOrderMapperselectJoinOne 方法。这个 insteadOrderMapper 可能是一个自定义的 Mapper,它扩展了 MyBatis-Plus 的基本 Mapper 功能。

  3. 指定返回类型:

    InsteadOrderRespVO.class,
    

    指定查询结果的类型为 InsteadOrderRespVO 类。

  4. 构建查询条件:

    new MPJLambdaWrapper<InsteadOrderDO>()
    

    创建一个新的 MPJLambdaWrapper 实例,允许使用流畅的 Lambda 表达式方式构建复杂的 SQL 查询。

  5. 选择所有列:

    .selectAll(InsteadOrderDO.class)
    

    选择 InsteadOrderDO 表中的所有列。

  6. 左连接获取分析师信息:

    .selectAs("user1.username", InsteadOrderRespVO::getAnalystName)
    .leftJoin(AdminUserDO.class, "user1", AdminUserDO::getId, InsteadOrderDO::getAnalystId)
    

    执行左连接操作,连接 AdminUserDO 表,并将其别名为 “user1”。从 AdminUserDO 表中选择 username 列,并映射到 InsteadOrderRespVOanalystName 属性。连接条件是基于 AdminUserDOidInsteadOrderDOanalystId 匹配。

  7. 左连接获取发布者信息:

    .selectAs("user2.username", InsteadOrderRespVO::getPublisherName)
    .leftJoin(AdminUserDO.class, "user2", AdminUserDO::getId, InsteadOrderDO::getCustomerId)
    

    再次执行左连接操作,连接 AdminUserDO 表,并将其别名为 “user2”。从 AdminUserDO 表中选择 username 列,并映射到 InsteadOrderRespVOpublisherName 属性。连接条件是基于 AdminUserDOidInsteadOrderDOcustomerId 匹配。

  8. 添加等于条件:

    .eq(InsteadOrderDO::getId, id)
    

    添加一个等于条件,查询具有特定 id 的记录。
    最后执行查询并返回结果。

综上所述,这段代码的主要目的是根据提供的 id 查询一个 InsteadOrderRespVO 对象,并在该对象中填充 InsteadOrderDO 的所有字段以及关联的分析师和发布者的用户名。

使用 mybatis-plus-join 进行联查询,一般按以下方式操作: #### 1. 添加依赖 在 `pom.xml` 中添加 mybatis-plus-join 及其相关依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join</artifactId> <version>1.2.4</version> </dependency> ``` #### 2. 编写实体类 定义与数据库对应的实体类,可使用 MyBatis-Plus 的注解。 ```java import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") public class User { private Long id; private String name; // 其他属性及 getter/setter 方法 } ``` #### 3. 编写 Mapper 接口 继承 `MPJBaseMapper` 接口。 ```java import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends MPJBaseMapper<User> { } ``` #### 4. 进行联查询 使用 `MPJLambdaWrapper` 进行联查询。 ```java import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> multiTableQuery() { MPJLambdaWrapper<User> wrapper = new MPJLambdaWrapper<User>() .selectAll(User.class) .leftJoin(OtherTable.class, OtherTable::getUserId, User::getId); return userMapper.selectJoinList(User.class, wrapper); } } ``` `MPJLambdaWrapper` 的使用说明: - `selectAll(User.class)`:查询主全部字段(主实体类),默认主别名 "t" [^2]。 - `select()`:mp 的 select 策略是覆盖,以最后一次为准,这里的策略是追加,可以一直 select。主字段可以用 lambda,会自动添加别名,主别名默认是 t,非主字段必须带别名查询 [^2]。 - `leftJoin()`、`rightJoin()`、`innerJoin()`:传 sql 片段,格式 ( + 别名 + 关联条件) [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值