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

如何在NestJS中使用Not或!=操作符?查询返回空数组求解

解决NestJS中TypeORM关联查询返回空数组的问题

排查与修复步骤

1. 确认Not操作符的正确导入

首先确保你已经从TypeORM中导入了Not操作符,否则查询条件会直接失效:

import { Not } from 'typeorm';

2. 匹配ID的数据库字段类型

如果你的catalogue表中id是数字类型,而传入的参数是字符串,必须先做类型转换,否则会因类型不匹配查不到数据:

async getAllPhoto(id: string) {
  // 转换为数字(根据你的数据库字段类型调整,比如UUID则无需转换)
  const targetId = Number(id);
  if (isNaN(targetId)) {
    throw new Error('无效的分类ID');
  }

  const photos = await this._photoRepository.find({
    relations: { catalogue: true },
    where: { catalogue: { id: Not(targetId) } },
  });
  return photos;
}

3. 验证实体关联关系定义

检查Photo与Catalogue的实体关联是否配置正确,比如Photo实体中的关联字段:

// photo.entity.ts
import { Entity, PrimaryGeneratedColumn, ManyToOne } from 'typeorm';
import { Catalogue } from './catalogue.entity';

@Entity()
export class Photo {
  @PrimaryGeneratedColumn()
  id: number;

  // 确保@ManyToOne的关联指向正确,反向关联字段(如果有)配置无误
  @ManyToOne(() => Catalogue, (catalogue) => catalogue.photos)
  catalogue: Catalogue;
}

4. 可选:改用QueryBuilder查询(更直观易排查)

如果find方法的嵌套条件仍有问题,用QueryBuilder重构查询逻辑会更清晰,也更容易定位问题:

async getAllPhoto(id: string) {
  const targetId = Number(id);
  if (isNaN(targetId)) {
    throw new Error('无效的分类ID');
  }

  const photos = await this._photoRepository
    .createQueryBuilder('photo')
    .leftJoinAndSelect('photo.catalogue', 'catalogue')
    .where('catalogue.id != :id', { id: targetId })
    // 若需要包含未关联任何分类的图片,添加OR条件
    // .orWhere('photo.catalogue IS NULL')
    .getMany();

  return photos;
}

5. 特殊场景处理

如果存在未关联任何Catalogue的Photo(即catalogue字段为null),且你希望这类数据也被返回,需要在查询条件中补充OR规则:

// find方法的写法
const photos = await this._photoRepository.find({
  relations: { catalogue: true },
  where: [
    { catalogue: { id: Not(targetId) } },
    { catalogue: null }
  ],
});

内容的提问来源于stack exchange,提问作者hassen mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:15:49