NestJS TypeORM PostgreSQL中OR组合查询失效问题
NestJS + TypeORM PostgreSQL 查询OR条件不生效问题修复
问题说明
在NestJS项目中使用TypeORM操作PostgreSQL时,期望实现以下查询逻辑:
- 输入
searchText时,以OR模式匹配name或agreementNumber字段(任一匹配即可) - 同时支持结合
id、enquiryId、applicantId的精确筛选
但当前代码中的OR条件写法错误,导致无法达到预期效果。
错误原因
TypeORM的FindOptionsWhere对象并不支持_OR这种自定义属性写法,该属性无法被TypeORM解析,因此OR条件不生效。正确的多条件组合(AND + OR)需要将where构造成数组形式,通过数组元素组合AND逻辑,OR逻辑则嵌套在单个元素中。
修复方案
重新构造where条件:
- 先收集所有精确匹配的条件到一个对象中
- 如果存在
searchText,则将精确条件对象与OR搜索条件组合成数组元素;若无精确条件,直接使用OR条件数组 - 如果没有
searchText,则直接使用精确条件对象
修复后的完整代码
async findAll(filter: DataFilterDto): Promise<ApiResponseDto> { const take = filter.count || 10; const pageNo = filter.pageNo > 0 ? filter.pageNo - 1 : 0; const skip = pageNo * take; // 收集精确匹配条件 const exactConditions: FindOptionsWhere<AgreementEntity> = {}; if (HelperService.isValueValid(filter.id)) { exactConditions.id = filter.id; } if (HelperService.isValueValid(filter.enquiryId)) { exactConditions.enquiryId = filter.enquiryId; } if (HelperService.isValueValid(filter.applicantId)) { exactConditions.applicantId = filter.applicantId; } let where: FindOptionsWhere<AgreementEntity> | FindOptionsWhere<AgreementEntity>[] = exactConditions; if (HelperService.isValueValid(filter.searchText)) { const iLike = ILike(`%${filter.searchText}%`); const orConditions = [ { name: iLike }, { agreementNumber: iLike } ]; // 组合精确条件与OR条件:精确条件 AND (name LIKE OR agreementNumber LIKE) if (Object.keys(exactConditions).length > 0) { where = [ { ...exactConditions, OR: orConditions } ]; } else { // 只有OR条件时直接使用数组 where = orConditions; } } const query = { where: where, relations: ["enquiryInfo", "enquiryInfo.applicantInfo"], order: { id: SortOrder.Desc }, take, skip, }; let [result, total] = await this.agreementsRepo.findAndCount(query); return { data: result, count: total }; }
代码说明
- 精确筛选条件和OR搜索条件通过
OR属性嵌套组合,TypeORM会自动解析为AND+OR逻辑:(精确条件) AND (name LIKE '%xxx%' OR agreementNumber LIKE '%xxx%') - 无精确条件时,直接使用OR条件数组,实现
name LIKE '%xxx%' OR agreementNumber LIKE '%xxx%'逻辑 - 无搜索文本时,直接使用精确条件对象,保持原有精确筛选逻辑
内容的提问来源于stack exchange,提问作者Code Guru
相关产品推荐
相关产品推荐

