You need to enable JavaScript to run this app. TypeORM-NestJs基于JSON字段关联MySQL表出现语法报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM-NestJs基于JSON字段关联MySQL表出现语法报错如何解决

问题解决:TypeORM关联MySQL JSON字段语法报错修复

错误根因

你遇到的1064语法错误有两个核心问题:

  • MySQL访问JSON字段属性的语法错误,你使用的$.Id写法没有放在JSON操作符的参数内,不符合MySQL语法规范
  • innerJoinAndMapMany第一个参数填写错误,该参数是需要映射到主表实体上的自定义属性名,不能填写主表已有的主键字段t1.Id

修改规则

MySQL访问JSON列column_name下的Id属性,支持两种合法写法:

  1. 函数写法:JSON_EXTRACT(t2.column_name, '$.Id'),返回带外层引号的字符串
  2. 快捷操作符:t2.column_name->'$.Id' 等价于上面的函数写法,如果需要自动去掉外层引号做值匹配,用->>操作符:t2.column_name->>'$.Id'

修正后的代码示例

首先需要在ABCEntity中提前定义用来存储关联t2数据的属性,比如命名为t2Records: xyzEntity[],修改后的查询代码如下:

const results  = await this.connection.createQueryBuilder(ABCEntity,'t1')
    // 第一个参数改为你在ABCEntity中定义的关联属性名,JSON访问用->>操作符匹配字符串
    .innerJoinAndMapMany('t1.t2Records', xyzEntity, 't2', 't1.Id = t2.column_name->>"$.Id"')
    .where('t1.Id = :Id', { Id: id })
    .getMany()
    .catch(err => console.log(err));

补充注意事项

  • 如果你的t1.Id是数值类型,需要把JSON取出的值转成数值再匹配,关联条件写法改为:CAST(t2.column_name->>"$.Id" AS UNSIGNED) = t1.Id
  • 请确保xyzEntity中对应的JSON存储字段在实体定义时标记了type: 'json'

内容的提问来源于stack exchange,提问作者shuaib khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 15:06:06