You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:12:48