NestJS如何按Category筛选查询BookEntity分页列表?
按Category筛选BookEntity的实现方案
因为你的category字段使用TypeORM的simple-array类型,该类型在数据库中以逗号分隔的字符串形式存储(例如test1,test2,test3),需要针对性添加筛选逻辑,同时完善分页功能,修改后的方法如下:
修改后的getBooks方法
public async getBooks(page: number, category?: string): Promise<PageDto<BookEntity>> { try { const queryBuilder = this.bookRepository.createQueryBuilder("book_entity"); // 新增分类筛选逻辑 if (category) { // 通用数据库适配方案:用LIKE匹配完整分类项,避免部分匹配 queryBuilder.where("book_entity.category LIKE :category", { category: `%,${category},%` }); // PostgreSQL专属优化方案(若数据库支持原生数组): // queryBuilder.where("array_contains(book_entity.category, :category)", { category }); } // 完善分页逻辑:计算跳过的条目数 const take = 10; const skip = (page - 1) * take; queryBuilder.take(take).skip(skip); const itemCount = await queryBuilder.getCount(); const { entities } = await queryBuilder.getRawAndEntities(); const pageData = new PageDto<BookEntity>(entities, itemCount, page); return pageData; } catch (error) { console.log("Getting books error: ", error); throw error; // 抛出错误便于上层处理 } }
关键说明
- 通用筛选逻辑:使用
LIKE匹配,${category},,可以避免类似test22被误判为包含test2的情况,适配MySQL、SQLite等多数数据库。 - PostgreSQL优化:如果你的数据库是PostgreSQL,TypeORM的
simple-array会映射为原生数组类型,此时使用array_contains函数更准确、性能更优。 - 分页完善:补充了
skip计算逻辑,否则所有页码都会返回前10条数据,分页功能失效。 - 异常处理:在catch块中抛出错误,让调用方可以捕获并处理异常,而不是仅打印日志。
内容的提问来源于stack exchange,提问作者Vlad Skoromnyi
相关产品推荐
相关产品推荐

