解决IPage+ QueryWrapper 多表联查
时间: 2023-07-19 16:32:11 浏览: 197
在使用 MyBatis-Plus 中的 IPage 分页查询时,如果需要进行多表联查,可以通过 QueryWrapper 来实现。以下是一个示例:
假设我们有两个实体类 User 和 Order,它们之间存在一对多的关系,即一个用户可以有多个订单。我们需要查询用户和订单的信息,并按照订单的创建时间倒序排序。
首先,我们可以定义一个 VO 类,用于封装查询结果:
```java
public class UserOrderVO {
private Long userId;
private String userName;
private List<Order> orderList;
// getters and setters
}
```
然后,我们可以使用 QueryWrapper 来进行多表联查:
```java
QueryWrapper<User> userWrapper = new QueryWrapper<>();
userWrapper.select("id as userId", "name as userName")
.orderByDesc("create_time");
QueryWrapper<Order> orderWrapper = new QueryWrapper<>();
orderWrapper.eq("status", 1);
IPage<UserOrderVO> page = new Page<>(1, 10);
page = userService.page(page, userWrapper);
List<UserOrderVO> voList = new ArrayList<>();
for (User user : page.getRecords()) {
UserOrderVO vo = new UserOrderVO();
BeanUtils.copyProperties(user, vo);
orderWrapper.eq("user_id", user.getId());
List<Order> orderList = orderService.list(orderWrapper);
vo.setOrderList(orderList);
voList.add(vo);
}
```
在上面的示例中,我们分别定义了两个 QueryWrapper,其中 userWrapper 用于查询用户信息,orderWrapper 用于查询订单信息。在 userWrapper 中,我们使用 select 方法来指定查询的字段,并使用 orderByDesc 方法按照创建时间倒序排序。在 for 循环中,我们根据每个用户的 id 查询其对应的订单信息,并将查询结果封装到 UserOrderVO 中,最后将所有的 VO 对象添加到一个 List 中返回。
需要注意的是,由于 MyBatis-Plus 的分页查询是先进行总记录数的查询,再进行分页查询的,因此在多表联查的情况下可能会影响性能。如果数据量较大,可以考虑使用手动分页来提高查询效率。
阅读全文