TypeORM findOneBy查询返回NotFound问题求助
问题原因与解决方案
核心错误:MongoDB与SQL注解混用导致字段类型不匹配
你的实体类注解存在关键错误,混淆了SQL和MongoDB的字段映射规则,导致查询时类型不匹配,无法找到记录。
具体问题分析
错误的字段注解
- 你给
_id属性使用了SQL专属的@PrimaryGeneratedColumn({ name: 'id' })注解,这会让TypeORM将数据库中名为id的字段映射到_id属性,且默认按SQL自增主键处理。 - 给
id属性使用了MongoDB专属的@ObjectIdColumn()注解,这会让TypeORM认为数据库中的id字段是MongoDB的ObjectId类型,但实际你的数据库中id是数值类型(如1)。
- 你给
查询时的类型不匹配
当调用findOneBy({id})时,TypeORM会将传入的数值1转换为ObjectId类型去数据库匹配,但数据库中id是数值1,完全不匹配,因此返回null。
修复步骤
修改实体类的字段注解,使其正确对应MongoDB的存储结构:
// 替换原有的_id和id字段注解 @ObjectIdColumn() _id!: string; // 对应MongoDB原生的_id字段(ObjectId类型) @Column() id: number; // 对应数据库中的id字段(数值类型) // 其余字段保持不变 @AutoMap() @Column() scriptSequenceId: string; @Column({default: EnumsStatusExecution.EXECUTION_STARTED}) status: EnumsStatusExecution; @AutoMap() @Column() scriptExecutionStatus: ScriptExecutionStatusType[]; @AutoMap() @Column() creator: string; @AutoMap() @Column({ length: 64 }) userUpdater: string; @AutoMap() @Column() creationDate: Date; @AutoMap() @Column() lastUpdatedDate: Date;
修复说明
@ObjectIdColumn():专门用于映射MongoDB的原生_id字段,无需额外配置名称,TypeORM会自动关联。@Column():用于映射普通数值/字符串类型的字段,正确匹配数据库中id字段的数值类型。
修改后重启应用,调用findOneSequence(1)即可正常查询到对应记录。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

