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() 不会返回总数