Nest 复杂查询
2023-02-18 16:38:44 时间
复杂查询包括分页、模糊查询、多条件筛选、排序等,满足前端对查询的所有诉求。
Nest 复杂查询,主要使用 repository.findAndCount()
方法实现。
假设有一个能分页查询所有用户,可根据用户名进行筛选,并对结果按照更新时间倒序排序的需求,它的 controller
如下:
@Post()
@Roles(Role.Admin, Role.SuperAdmin)
async pageQuery(@Body() dto: QueryUserDto) {
const res = await this.userService.pageQuery(dto);
return successResult(res);
}
QueryUserDto
是查询参数类型
// BaseQueryDto.ts
import { IsNotEmpty, IsNumber } from 'class-validator';
export class BaseQueryDto {
@IsNotEmpty()
@IsNumber()
page: number;
@IsNotEmpty()
@IsNumber()
pageSize: number;
}
// QueryUserDto.ts
export class QueryUserDto extends BaseQueryDto {
username: string;
}
下面来看 UserService
如何实现
// user.service.ts
async pageQuery(dto: QueryUserDto) {
const { username, pageSize, page } = dto;
// 筛选状态为正常的数据
const queryFilter: any = { status: DATA_STATUS.NORMAL };
if (username) {
// 模糊查询 username
queryFilter.username = Like(`%${username}%`);
}
const res = await this.userRepository.findAndCount({
// 查询条件
where: queryFilter,
// 排序
order: { updateTime: 'DESC' },
// offset,分页的偏移量
skip: (page - 1) * pageSize,
// 每页条数
take: pageSize,
// 是否缓存
cache: true,
});
return loadPageQueryResult(res, pageSize);
}
// 拼接返回结果的数据结构
export function loadPageQueryResult(findAndCountRes: any, pageSize: number) {
const list = findAndCountRes[0];
const totalCount = findAndCountRes[1];
const totalPage = Math.ceil(totalCount / pageSize);
return {
list,
totalCount,
totalPage,
};
}
通过 findAndCount()
方法可以一次性得到想要的结果,它支持传入多个参数。
where 主要传入查询条件,是一个对象,对象的 key 是数据库字段,value 是要查询的值,把上面的 queryFilter 合并一下,就是如下这种形式,要查多少个属性都可以。
{
status: DATA_STATUS.NORMAL,
username: Like(`%${username}%`)
}
相关文章
- 曾经黑掉白宫官网的红客联盟,核心成员互怼撕逼。
- JVM堆内存导致的FGC问题排查
- API集成测试:SpringBoot+Junit
- 分销商如何转型,南京创瑞丰打了个样儿
- 紧密合作三周年,Elastic颁发腾讯云2022年杰出开源贡献奖
- H5开屏从龟速到闪电,企微是如何做到的
- SpringBoot 使用装饰器模式,快看,它装起来了~
- 一次在工作组的内网里渗透到第三层内网【从 0 到 1 打穿所有内网机器】
- 《2022中国各地区科创之星势力图2.0版》重磅发布
- 《2022中国企业数智化转型升级服务全景图/产业图谱2.0版》重磅发布
- 《2022中国数据智能产业图谱2.0版》重磅发布
- 腾讯业内首发数字孪生云;小鹏汽车Q3收入68亿,亏损24亿;英矽智能拿下中国AI制药“最大订单”|每日大事件
- 弘玑创始人高煜光:原生AI加持的超自动化平台,是企业释放数字生产力的关键“钥匙” | 数据猿专访
- 策略模式最简洁的实现方式是?
- 详解JAVA线程问题诊断工具Thread Dump
- 还在手动发早安吗?教你用java实现每日给女友微信发送早安
- Java开发如何通过IoT边缘ModuleSDK进行进程应用的开发?
- 解读Java内存模型中Happens-Before的8个原则
- Java7提供的Fork/Join框架实现高并发程序,你会使用吗?
- Java开发如何通过IoT边缘ModuleSDK进行协议转换?