nestjs typeorm 条件筛选、排序、分页 常见查询功能的实现

1. 准备工作:使用 InjectRepository 注入Repository,然后创建一个 queryBuilder

@Injectable()
export class TicketDao {

  constructor(
    @InjectRepository(TicketEntity)
    private readonly ticketRepo: Repository<TicketEntity>        // 依赖注入
  ) {}

  async filterAndPageQuery(){
    let qb = this.ticketRepo.createQueryBuilder('ticket')        // 创建queryBuilder
    // 接下来写条件筛选和分页查询代码,代码看下面代码条
    // 接下来的 qb.xxx 都是使用 QueryBuilder 的增删查改操作
  }

}

2. 条件筛选查询,如名称、类型等,传入对应字段即可

qb = qb.where(queryParams as Partial<TicketEntity>)

3. 时间范围筛选

if (updateTimeRange && updateTimeRange.start && updateTimeRange.end) {
  qb = qb.andWhere('update_time BETWEEN :start AND :end', {
    start: updateTimeRange.start,
    end: updateTimeRange.end
  })
}

4. 自定义条件、多重排序

// 普通排序
qb = qb.orderBy('update_time', 'DESC')


// 自定义条件,且多重排序
// 例如:assignee字段为 ${userName} 的优先显示,然后再在此基础上再进行时间和状态的排序
qb = qb
    .orderBy(`case assignee when assignee="${userName}" then 1 else 0 end`)
    .addOrderBy('status', 'ASC')
    .addOrderBy('update_time', 'DESC')

4. 分页

    qb = qb
      .skip(pageParam.pageSize * (pageParam.current - 1))
      .take(pageParam.pageSize)

/* 其中限制获取的条数,用 take 和 limit 都可以,官方给出的文档说明
take: 
     * Sets maximal number of entities to take.
limit:     
     * Set's LIMIT - maximum number of rows to be selected.
     * NOTE that it may not work as you expect if you are using joins.
     * If you want to implement pagination, and you are having join in your query,
     * then use instead take method instead.
因此限制返回条数的话,首先考虑使用take。limit 是 take 的功能子集
*/

5. 获取结果及(非分页的)查询结果总数

return await qb.getManyAndCount()

// 或使用 .getMany() 不会返回总数

 

 

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NestJS中使用TypeORM进行分页查询的步骤如下: 1. 首先,在你的DAO或Repository文件中使用`InjectRepository`注入Repository: ```typescript @Injectable() export class TicketDao { constructor( @InjectRepository(TicketEntity) private readonly ticketRepo: Repository<TicketEntity> ) {} } ``` 2. 在`async filterAndPageQuery()`方法中创建一个queryBuilder: ```typescript async filterAndPageQuery() { let qb = this.ticketRepo.createQueryBuilder('ticket'); // 在qb中可以写下面的条件筛选分页查询代码 // 接下来的 qb.xxx 都是使用 QueryBuilder 的增删查改操作 } ``` 3. 使用`skip`和`take`方法实现分页查询: ```typescript qb = qb .skip(pageParam.pageSize * (pageParam.current - 1)) .take(pageParam.pageSize); ``` 其中,`skip`方法用于设置跳过的条数,`take`方法用于限制查询的条数。 4. 获取查询结果及查询结果总数: ```typescript return await qb.getManyAndCount(); ``` 或者,如果你只需要查询结果而不需要总数,可以使用`.getMany()`方法。 以上是使用NestJSTypeORM进行分页查询的基本步骤。你可以根据实际需求进行相应的修改和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [nestjs typeorm 条件筛选排序分页 常见查询功能实现](https://blog.csdn.net/landiyaaa/article/details/104730677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值