mybatisplus 一对多分页问题
时间: 2023-09-23 18:10:33 浏览: 106
在 MybatisPlus 中实现一对多关联分页查询可以使用 MybatisPlus 提供的分页插件 Page 和 Wrapper 的组合。
假设有两个实体类 A 和 B,它们之间是一对多的关系,即一个 A 对应多个 B。我们需要查询 A 对象及其对应的 B 列表,并进行分页。
1. 创建 Wrapper
我们可以使用 QueryWrapper 或 LambdaQueryWrapper 创建 Wrapper 对象,用于构造查询条件。
```java
QueryWrapper<A> wrapper = new QueryWrapper<>();
wrapper.eq("name", "aName");
```
2. 构造查询条件
构造查询条件时,我们需要使用 MybatisPlus 提供的 selectPage 方法,该方法接收一个 Page 对象和一个 Wrapper 对象作为参数。其中,Page 对象表示分页信息,Wrapper 对象表示查询条件。
```java
Page<A> page = new Page<>(1, 10);
IPage<A> result = aMapper.selectPage(page, wrapper);
```
3. 执行查询
在执行查询时,我们需要使用 MybatisPlus 提供的 @TableField 注解,用于标识实体类 A 中对应的 B 列表,以及 MybatisPlus 提供的 @Result 注解,用于配置查询结果映射。
```java
public class A {
@TableField(exist = false)
private List<B> bList;
}
@Results({
@Result(property = "bList", column = "id",
many = @Many(select = "com.example.mapper.BMapper.selectByAId"))
})
public interface AMapper extends BaseMapper<A> {}
```
其中,@TableField 注解中的 exist 属性设置为 false,表示该字段在数据库表中不存在,只是用于在查询时保存 B 列表的结果。
@Result 注解中的 many 属性表示多对一关系,即一个 A 对应多个 B,select 属性表示查询 B 列表的 SQL 语句。
4. 完整代码
```java
public class A {
@TableField(exist = false)
private List<B> bList;
// getter 和 setter 方法
}
public class B {
// 属性和 getter/setter 方法
}
public interface AMapper extends BaseMapper<A> {}
public interface BMapper extends BaseMapper<B> {
List<B> selectByAId(Integer aId);
}
@Service
public class AService {
@Autowired
private AMapper aMapper;
@Autowired
private BMapper bMapper;
public IPage<A> selectByPage(Integer pageNum, Integer pageSize) {
QueryWrapper<A> wrapper = new QueryWrapper<>();
wrapper.eq("name", "aName");
Page<A> page = new Page<>(pageNum, pageSize);
IPage<A> result = aMapper.selectPage(page, wrapper);
List<A> aList = result.getRecords();
for (A a : aList) {
List<B> bList = bMapper.selectByAId(a.getId());
a.setBList(bList);
}
return result;
}
}
```
阅读全文