NestJs 下使用 TypeORM 分页查询问题

开发应用程序时,大部分时间都需要分页功能。如果您的应用程序中有分页、页面滑块或无限滚动组件,则使用此选项。

官方教程

DEMO

1
2
3
4
5
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.take(10)
.getManyAndCount();

这将会查询前10条用户及其照片的数据。

1
2
3
4
5
6
// getManyAndCount 返回一个长度为2的元组,[0] 是分页后的数据数组, [1] 是所有数据总数
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.skip(10)
.getManyAndCount();

这将会查询除了前10条用户以外的所有人及其照片的数据。

您可以组合使用他们:

1
2
3
4
5
6
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.skip(5)
.take(10)
.getManyAndCount();

这将会在第6条记录开始查询10条记录,即查询6-16条用户及其照片的数据。

注意:takeskip 可能看起来像 limitoffset,但它们不是。一旦您有更复杂的连接或子查询查询,limitoffset 可能无法正常工作。使用 takeskip 可以防止出现这些问题。

skip + take 与 offset + limit 的区别

当查询中存在连接或子查询时,skip + take 的方式总是能正确的返回数据,而 offset + limit 返回的数据并不是我们期望的那样。所以查询分页数据时,应该使用 skip + take

广告

阿里云活动云服务器低至
1核-2G-1M,1年89元,3年229。
2核-4G-3M,2年469元,3年799。
2核-8G-5M,3年899元。
新老客户都有优惠 点击查看详情/购买
腾讯云现在活动
1核 2G 1M 88一年
2核 4G 5M 3年只要998。 点击查看详情/购买