LambdaQueryWrapper 如何多表联查
时间: 2024-04-26 19:19:19 浏览: 427
LambdaQueryWrapper 是 MyBatis-Plus 提供的一种基于 lambda 表达式的查询构造器,它可以帮助我们进行复杂的多表联查操作。下面是一个例子:
假设我们有两个实体类 User 和 Order,分别代表用户和订单,其中订单表中有一个 user_id 字段,表示订单所属用户的 id。我们想要查询所有用户及其对应的订单信息,可以使用 LambdaQueryWrapper 进行联查。
具体操作如下:
1. 首先在 User 类中定义一个 List<Order> 属性,并添加 @TableField(exist = false) 注解,表示该属性不对应数据库表中的字段。
```
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(exist = false)
private List<Order> orders;
// 省略 getter 和 setter 方法
}
```
2. 在 Order 类中定义一个 User 属性,并添加 @TableField(exist = false) 注解,同样表示该属性不对应数据库表中的字段。
```
public class Order {
@TableId(type = IdType.AUTO)
private Long id;
private Long userId;
private BigDecimal price;
@TableField(exist = false)
private User user;
// 省略 getter 和 setter 方法
}
```
3. 然后就可以使用 LambdaQueryWrapper 进行联查了。代码如下:
```
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User.class, u -> !u.getProperty().equals("orders"));
wrapper.eq(User::getId, 1L);
List<User> userList = userMapper.selectList(wrapper);
LambdaQueryWrapper<Order> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.in(Order::getUserId, userList.stream().map(User::getId).collect(Collectors.toList()));
List<Order> orderList = orderMapper.selectList(orderWrapper);
userList.forEach(user -> user.setOrders(orderList.stream().filter(order -> order.getUserId().equals(user.getId())).collect(Collectors.toList())));
```
上面的代码中,首先创建一个 LambdaQueryWrapper 对象 wrapper,并调用 select 方法指定要查询的字段,通过 !u.getProperty().equals("orders") 排除 orders 属性。然后使用 eq 方法指定查询条件为 id = 1L。
接着创建一个 LambdaQueryWrapper 对象 orderWrapper,并使用 in 方法指定查询条件为 userId 在 userList 中。最后分别使用 userMapper 和 orderMapper 的 selectList 方法查询结果,并通过 Java 8 的 Stream API 进行处理,将查询出来的订单信息设置到对应的用户对象中。
阅读全文