写一个基于mybatisplus的三表联查
时间: 2023-07-04 08:22:02 浏览: 62
假设我们有三张表:用户表(user)、订单表(order)和商品表(product),其中订单表和商品表分别与用户表关联。下面是一个基于 MyBatis-Plus 的三表联查的示例代码:
```
public List<User> getUserWithOrderAndProduct(long userId) {
LambdaQueryWrapper<User> userWrapper = Wrappers.<User>lambdaQuery()
.eq(User::getId, userId);
// 关联订单表
LambdaQueryWrapper<Order> orderWrapper = Wrappers.<Order>lambdaQuery()
.select(Order::getId, Order::getUserId, Order::getProductId)
.eq(Order::getUserId, userId);
// 关联商品表
LambdaQueryWrapper<Product> productWrapper = Wrappers.<Product>lambdaQuery()
.select(Product::getId, Product::getName, Product::getPrice)
.inSql(Product::getId, "SELECT product_id FROM `order` WHERE user_id = " + userId);
return userService.list(userWrapper)
.stream()
.peek(user -> {
List<Order> orders = orderService.list(orderWrapper);
List<Product> products = productService.list(productWrapper);
orders.forEach(order -> {
products.stream().filter(product -> product.getId().equals(order.getProductId())).findFirst().ifPresent(product -> order.setProduct(product));
});
user.setOrders(orders);
})
.collect(Collectors.toList());
}
```
该方法可以获取指定用户的订单和商品信息,并将其与用户信息一起返回。其中,我们使用 MyBatis-Plus 提供的 LambdaQueryWrapper 来构建查询条件,通过 select 方法选择需要查询的字段,通过 eq 方法设置关联条件,通过 inSql 方法实现关联查询。在查询结果中,我们通过遍历用户列表,分别查询该用户的订单和商品信息,并将其设置到用户实体中。