QueryWrapper多表联查分页
时间: 2025-03-06 19:07:09 浏览: 50
### 使用 QueryWrapper 实现 MyBatis Plus 多表联查分页查询
为了实现多表联查并进行分页操作,可以利用 `QueryWrapper` 和 `Page<T>` 类。下面是一个完整的例子展示如何使用这些工具完成所需功能。
#### 定义实体类
假设存在两个实体类:`User` 表示用户信息;`Order` 表示订单详情。这两个表之间有一对多的关系——即一个用户可能有多个订单。
```java
public class User {
private Long id;
private String name;
}
public class Order {
private Long orderId;
private Long userId; // 关联字段
private BigDecimal amount;
}
```
#### 创建 Mapper 接口
创建对应的 Mapper 接口继承自 `BaseMapper<User>` 或者 `BaseMapper<Order>`, 并添加自定义方法来进行联合查询:
```java
@Mapper
public interface UserMapper extends BaseMapper<User> {
/**
* 联合查询用户及其订单数据,并按需过滤和分页.
*/
IPage<Map<String, Object>> getUserOrders(IPage<?> page, Wrapper<Record> queryWrapper);
}
```
注意这里的返回类型是 `IPage<Map<String,Object>>`. 这样做是因为当执行跨表查询时,结果集通常不会直接映射到单一的 Java 对象上,而是作为一个键值对的形式存储起来[^1].
#### 编写 XML 映射文件
在相应的 XML 文件中编写 SQL 语句来处理这个复杂的查询逻辑:
```xml
<select id="getUserOrders" resultType="map">
SELECT u.*, o.order_id as 'order.id', o.amount FROM user u LEFT JOIN orders o ON u.id = o.user_id
<where>
<!-- 动态构建 WHERE 子句 -->
<if test="_parameter != null and _parameter.containsKey('name')">
AND u.name LIKE CONCAT('%', #{_parameter.name}, '%')
</if>
</where>
</select>
```
上述代码片段展示了如何通过 `<if>` 标签动态地向 SQL 中加入条件. 同时也包含了左连接 (`LEFT JOIN`) 来获取用户的订单信息.
#### 构建 QueryWrapper 及调用服务层方法
最后,在 Service 层里构造好 `QueryWrapper` 参数传给 DAO 方法即可获得最终的结果集:
```java
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
public PageResult getUsersWithOrders(PageRequest request){
// 初始化分页参数
Page<Object[]> page = new Page<>(request.getPageNum(), request.getPageSize());
// 构造查询封装器
QueryWrapper wrapper = Wrappers.<Object>query()
.like(StringUtils.isNotBlank(request.getName()), "u.name", "%" + request.getName() +"%");
// 执行查询
IPage<Map<String, Object>> iPage = userMapper.getUserOrders(page, wrapper);
// 将结果转换成业务模型...
return convertToPageResult(iPage);
}
...
}
```
此部分实现了基于请求参数构造 `QueryWrapper` ,并通过它传递至数据库访问层以取得经过筛选后的分页数据[^2].
阅读全文
相关推荐


















