queryWrapper 实现多表联查
时间: 2024-01-10 10:02:24 浏览: 229
在MyBatis中,可以使用QueryWrapper实现多表联查。QueryWrapper是MyBatis-Plus提供的一个查询构造器,它可以帮助我们方便地构造复杂的查询条件,并支持多表联查。
假设我们有两个表,分别是user和order,它们之间存在外键关系。我们可以使用QueryWrapper实现user和order表的联查,查询用户信息和对应的订单信息。
首先需要在实体类中定义对应的属性和关联关系:
```
public class User {
private Long id;
private String username;
private List<Order> orders;
// getters and setters
}
public class Order {
private Long id;
private String orderNo;
private Long userId;
// getters and setters
}
```
其中,User类中定义了一个List类型的属性orders,用于保存用户的订单信息。Order类中定义了一个userId属性,表示该订单所属的用户ID。
接下来,我们可以使用QueryWrapper实现多表联查,代码如下:
```
public List<User> selectUsersWithOrders() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("user.*", "order.id as order_id", "order.order_no as order_no")
.leftJoin("order", "user.id = order.user_id");
List<User> users = userMapper.selectList(wrapper);
Map<Long, User> userMap = new HashMap<>();
for (User user : users) {
Long userId = user.getId();
if (!userMap.containsKey(userId)) {
userMap.put(userId, user);
}
Order order = new Order();
order.setId(resultSet.getLong("order_id"));
order.setOrderNo(resultSet.getString("order_no"));
userMap.get(userId).getOrders().add(order);
}
return new ArrayList<>(userMap.values());
}
```
在这个方法中,我们首先创建了一个QueryWrapper对象,并使用select方法指定了需要查询的字段,包括user表的所有字段和order表的id和order_no字段。然后,使用leftJoin方法进行左连接操作,指定了连接条件。最后,使用selectList方法执行查询操作,得到结果集。我们遍历结果集,将查询结果填充到User对象中,并将User对象保存到一个Map中,以便后续处理。最后,返回Map中的所有User对象。
需要注意的是,在使用QueryWrapper进行多表联查时,需要使用select方法指定需要查询的字段,并使用别名区分不同表中的同名字段。同时,需要使用leftJoin、innerJoin等方法进行连接操作,并指定连接条件。
总结一下,QueryWrapper是MyBatis-Plus提供的一个查询构造器,它可以帮助我们方便地构造复杂的查询条件,并支持多表联查。在使用QueryWrapper进行多表联查时,需要使用select方法指定需要查询的字段,并使用别名区分不同表中的同名字段。同时,需要使用leftJoin、innerJoin等方法进行连接操作,并指定连接条件。
阅读全文