MybatisPlus LambdaQueryChainWrapper 联合查询

LambdaQueryChainWrapper 本身不直接支持像 SQL `JOIN` 那样的传统联合查询(即在一个查询语句中通过 `JOIN` 关联多个表并返回组合结果)。

它是一个链式调用的查询构造器,其核心优势在于通过 Lambda 表达式实现单表的类型安全、简洁的条件构建和查询执行(如 `eq`, `gt`, `like`, `orderBy`, `list`, `one`, `page` 等)。

然而,在实际开发中,可以通过以下几种方式实现类似"联合查询"的效果:

  1. 通过 `inSql` 或 `apply` 实现子查询关联

这是 LambdaQueryChainWrapper 最常用的"关联"方式,适用于一个表的条件依赖于另一个表的查询结果。

```java

// 查询所有有订单金额大于1000的用户

List<User> users = new LambdaQueryChainWrapper<>(userMapper)

.inSql(User::getId, "SELECT user_id FROM orders WHERE price > 1000")

.list();

```

这种方式本质上是执行了一个子查询,而不是 SQL JOIN,但能实现跨表的数据筛选。

  1. 通过 `@TableField` 注解 + 两次查询(推荐用于一对多)

对于一对多或一对一的关联场景(如查询用户及其订单),MyBatis-Plus 官方推荐的"极简"方案是:

  1. 先查主表:使用 `LambdaQueryChainWrapper` 查询用户列表。

  2. 再查从表:根据主表查询出的 ID,用另一个 `LambdaQueryWrapper` 查询关联的订单列表。

  3. 在代码中手动组合:将查询到的订单数据设置到对应的用户对象中。

```java

// 1. 查询所有年龄大于18的用户

List<User> users = new LambdaQueryChainWrapper<>(userMapper)

.ge(User::getAge, 18)

.list();

// 2. 为每个用户查询其订单

users.forEach(user -> {

List<Order> orders = new LambdaQueryWrapper<Order>()

.eq(Order::getUserId, user.getId())

.list();

user.setOrders(orders); // 假设 User 类中有 orders 字段

});

```

这种方式避免了复杂 SQL,逻辑清晰,且能充分利用 MyBatis-Plus 的单表查询优势。

  1. 使用 `@Select` 注解 + 自定义 SQL

如果需要复杂的 JOIN 查询,最直接的方式是在 Mapper 接口中使用 `@Select` 注解编写原生 SQL。

```java

@Select("SELECT u.*, o.order_no FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.name = {name}")

List<User> selectUserWithOrder(@Param("name") String name);

```

此时,你可以结合 `LambdaQueryWrapper` 的条件构建能力,通过 `@SelectProvider` 动态拼接 SQL。

总结

| 方式 | 是否支持 | 适用场景 | 推荐度 |

| :--- | :--- | :--- | :--- |

| `LambdaQueryChainWrapper` 单独使用 | ❌ 不支持 | 纯单表查询 | ⭐⭐⭐⭐⭐ |

| `inSql` / `apply` 子查询 | ✅ 支持(逻辑关联) | 一个表的条件依赖于另一个表的查询结果 | ⭐⭐⭐⭐ |

| 两次查询 + 代码组合 | ✅ 支持(业务层关联) | 一对多、一对一关联,返回完整对象树 | ⭐⭐⭐⭐⭐ |

| `@Select` 自定义 SQL | ✅ 支持(原生 JOIN) | 复杂的多表关联、聚合查询 | ⭐⭐⭐ |

因此,虽然 `LambdaQueryChainWrapper` 不能直接写 `JOIN`,但通过其链式调用的便利性,配合子查询或分步查询,完全可以高效地实现联合查询的业务需求。

相关推荐
kruptos9 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌9 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
benchmark_cc10 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库10 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H10 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒10 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP11 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
2601_9623824311 小时前
python快乐编程网络爬虫课后答案
python·网络爬虫·学习工具·课后答案·刷题app
鹏哥带你干乡墅12 小时前
优选乡墅赋能培训平台如何帮助提升乡村建设?
大数据·人工智能·python
江畔柳前堤12 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native