MyBatis Plus用QueryWrapper进行四表联查
时间: 2024-02-10 16:42:49 浏览: 95
MyBatis Plus的QueryWrapper可以方便地进行多表查询,以下是一个四表联查的示例:
假设我们有四张表,分别是user、order、order_item和product,它们的关系如下:
user(用户表):id、name、age、gender
order(订单表):id、user_id、order_time
order_item(订单项表):id、order_id、product_id、quantity、price
product(商品表):id、name、price
我们需要查询某个用户的所有订单以及订单项和商品信息。可以使用以下代码:
```java
QueryWrapper<User> userWrapper = new QueryWrapper<>();
userWrapper.eq("id", userId);
QueryWrapper<Order> orderWrapper = new QueryWrapper<>();
orderWrapper.eq("user_id", userId);
QueryWrapper<OrderItem> orderItemWrapper = new QueryWrapper<>();
orderItemWrapper.inSql("order_id", "SELECT id FROM order WHERE user_id = " + userId);
QueryWrapper<Product> productWrapper = new QueryWrapper<>();
productWrapper.inSql("id", "SELECT product_id FROM order_item WHERE order_id IN (SELECT id FROM order WHERE user_id = " + userId + ")");
List<Order> orderList = orderMapper.selectList(orderWrapper);
List<OrderItem> orderItemList = orderItemMapper.selectList(orderItemWrapper);
List<Product> productList = productMapper.selectList(productWrapper);
for (Order order : orderList) {
List<OrderItem> items = orderItemList.stream().filter(item -> item.getOrderId().equals(order.getId())).collect(Collectors.toList());
order.setOrderItems(items);
for (OrderItem item : items) {
Product product = productList.stream().filter(p -> p.getId().equals(item.getProductId())).findFirst().orElse(null);
item.setProduct(product);
}
}
User user = userMapper.selectOne(userWrapper);
user.setOrders(orderList);
return user;
```
首先,我们使用一个QueryWrapper<User>来查询指定用户,然后使用一个QueryWrapper<Order>来查询该用户的所有订单,使用一个QueryWrapper<OrderItem>来查询该用户的所有订单项,最后使用一个QueryWrapper<Product>来查询所有订单项对应的商品信息。
注意,由于order_item表中的order_id和product_id是外键,不能直接使用eq方法,需要使用inSql方法来查询。
最后,我们可以将查询到的结果组装成一个User对象返回。
阅读全文