TypeORM 0.3.12中FieldResolver的where语句无预期返回问题排查
TypeORM 0.3.12版本关联查询where条件失效问题排查与解决
问题背景
我近期将TypeORM从0.2.37版本升级至0.3.12版本后遇到异常:数据库中存在匹配条件的记录,但FieldResolver中的where语句无法返回对应的Answer实体(Question无法关联到Answer);回退到0.2.37版本则问题消失。注释where语句后,TypeORM 0.3.12可正常返回Answer,但业务逻辑必须保留该过滤条件。
相关代码
📁resolvers/📁types/📄question.ts
import { Ctx, FieldResolver, Resolver, ResolverInterface, Root, } from "type-graphql"; import { Context } from "./../../index" import { Answer } from "../../entities/answer"; import { Question } from "../../entities/question"; import { Posted_Answer } from "../../entities/posted_answer"; @Resolver((of) => Question) export class Question_Resolver implements ResolverInterface<Question> { @FieldResolver() async answers(@Root() root: Question, @Ctx() context: Context) { const answers = await context.connection.manager.find(Answer, { // 注释掉where语句后,TypeORM 0.3.12能正常返回关联的answers,但业务需要这个过滤条件 where: { question: root }, }); return answers; } }
问题成因
TypeORM 0.3.x版本对实体关联查询的条件解析逻辑做了重大调整:
- 在0.2.x版本中,直接传入完整实体实例(如代码中的
root)作为关联条件,框架会自动提取实体的主键字段构建查询语句; - 但0.3.x版本不再自动解析完整实体实例,若仍传入整个实体对象,框架会生成错误的查询条件(试图匹配整个实体对象而非主键值),最终导致查询无结果。
解决方法
方法一:明确指定关联主键字段
直接使用Question实体的主键(比如id)构建where条件,这是最推荐的长期解决方案:
const answers = await context.connection.manager.find(Answer, { where: { question: { id: root.id } }, });
方法二:使用QueryBuilder构建查询
通过QueryBuilder可以更精准地控制关联查询逻辑,完全适配新版本规则:
const answers = await context.connection.manager .createQueryBuilder(Answer, "answer") .where("answer.questionId = :questionId", { questionId: root.id }) .getMany();
方法三:临时开启legacy模式(不推荐)
如果暂时不想修改代码,可以在TypeORM配置中开启legacy: true,回退到0.2.x版本的实体解析逻辑,但该配置可能在后续版本中被移除,仅作为过渡方案:
// TypeORM配置文件示例 export default { // 其他配置项... legacy: true, };
内容的提问来源于stack exchange,提问作者Said Torres
相关产品推荐
相关产品推荐

