如果您需要首先获取符合条件的所有数据,然后在内存中进行筛选,以满足特定条件,而不是在数据库层面进行条件查询,您可以继续使用您的原始实现。但是,为了正确实现分页,您需要对分页结果进行调整。以下是一个可能的改进版本:
List<SysBeforeUser> sysBeforeUsers = baseMapper.selectList(sysBeforeUserQueryWrapper);
Page<SysBeforeUser> result = new Page<>(pageParam.getCurrent(), pageParam.getSize());
List<SysBeforeUser> pageEnd = new ArrayList<>();
if (!StringUtil.isEmpty(pageParam.getIsVip())) {
for (SysBeforeUser sysBeforeUser : sysBeforeUsers) {
if (sysBeforeUser.getIsVip().equals(pageParam.getIsVip())) {
pageEnd.add(sysBeforeUser);
}
}
result.setRecords(pageEnd.subList(
(int) result.offset(),
Math.min((int) result.offset() + result.getSize(), pageEnd.size())
));
result.setTotal(pageEnd.size());
} else {
result.setRecords(sysBeforeUsers.subList(
(int) result.offset(),
Math.min((int) result.offset() + result.getSize(), sysBeforeUsers.size())
));
result.setTotal(sysBeforeUsers.size());
}
return result;
在这里,使用了 subList
方法来截取符合分页条件的记录范围,并将其设置为 result
的 records
属性。请注意,由于 subList
的索引参数是基于列表的索引,因此需要将 result.offset()
强制转换为 int
类型。
虽然这种方法可以满足您的需求,但请注意,它在性能上可能不如在数据库层面进行分页查询,特别是在数据量较大的情况下。如果性能是关键考虑因素,建议尽量在数据库层面进行分页查询。
result.setRecords(pageEnd.subList(
(int) result.offset(),
Math.min((int) result.offset() + result.getSize(), pageEnd.size())
));
和
result.setRecords(sysBeforeUsers.subList(
(int) result.offset(),
Math.min((int) result.offset() + result.getSize(), sysBeforeUsers.size())
));是什么 意思?
这两行代码使用了 Java 中 List
接口的 subList
方法,用于获取原始列表的一个子列表。具体来说,这两行代码的目的是截取符合分页条件的记录范围,并将其设置为 result
对象的 records
属性,即将这个子列表作为查询结果返回。
让我解释一下这两行代码的具体含义:
-
pageEnd.subList((int) result.offset(), Math.min((int) result.offset() + result.getSize(), pageEnd.size()))
:pageEnd
是您根据条件筛选得到的SysBeforeUser
列表。result.offset()
返回当前分页的偏移量,即从哪一条记录开始。Math.min((int) result.offset() + result.getSize(), pageEnd.size())
确保截取的范围不超过pageEnd
的实际大小。- 因此,这一行代码截取了
pageEnd
列表中,从result.offset()
到Math.min((int) result.offset() + result.getSize(), pageEnd.size())
的子列表,并将其设置为result
的records
属性。
-
sysBeforeUsers.subList((int) result.offset(), Math.min((int) result.offset() + result.getSize(), sysBeforeUsers.size()))
:sysBeforeUsers
是从数据库中查询得到的所有SysBeforeUser
列表。result.offset()
返回当前分页的偏移量,即从哪一条记录开始。Math.min((int) result.offset() + result.getSize(), sysBeforeUsers.size())
确保截取的范围不超过sysBeforeUsers
的实际大小。- 因此,这一行代码截取了
sysBeforeUsers
列表中,从result.offset()
到Math.min((int) result.offset() + result.getSize(), sysBeforeUsers.size())
的子列表,并将其设置为result
的records
属性。
这两行代码的目的是为了根据分页信息,从完整的记录集中截取出当前页的记录,以便于设置到 result
对象中返回给调用者。
不过建议还是使用IService的page(page, wrapper)方法,this.page(E page, Wrapper queryWrapper):
default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {
return this.getBaseMapper().selectPage(page, queryWrapper);
}