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

如何在TypeORM中正确左连接JSON函数?

解决TypeORM中左连接JSON函数时的转义问题

这个问题我之前也踩过坑!TypeORM默认会把leftJoin的第一个参数当作数据库表名处理,所以自动给你的JSON函数表达式套了双引号,导致PostgreSQL把它识别成了一个不存在的表,自然就抛出错误了。

要解决这个问题,核心是告诉TypeORM你传递的是原生SQL表达式而非表名,这里可以用TypeORM提供的raw()函数来实现:

步骤1:导入raw函数

先从TypeORM包中导入raw工具函数:

import { raw } from 'typeorm';

步骤2:改写leftJoin语句

用raw()包裹你的JSON函数表达式,替换原来的字符串参数:

const result = await getRepository(YourEntity)
  .createQueryBuilder('v1')
  // 用raw()包裹JSON函数,避免被自动转义
  .leftJoin(raw(`json_array_elements ((v1.profile -> 'associatedProfiles') :: json)`), 'ap')
  // 如果需要显式指定连接条件,可添加第三个参数,比如'true'
  // .leftJoin(raw(`json_array_elements ((v1.profile -> 'associatedProfiles') :: json)`), 'ap', 'true')
  .select(['v1.id', 'ap.*']) // 按需选择需要查询的字段
  .getMany();

这样生成的SQL语句就会和你期望的完全一致:

LEFT JOIN json_array_elements ((v1.profile -> 'associatedProfiles') :: json) ap ON true

额外技巧:映射JSON数组到实体属性

如果想把解析后的JSON数组直接映射到你的实体属性上,可以用leftJoinAndMapMany方法,更便捷:

await getRepository(YourEntity)
  .createQueryBuilder('v1')
  .leftJoinAndMapMany(
    'v1.associatedProfiles', // 实体上用来接收数组的目标属性
    raw(`json_array_elements ((v1.profile -> 'associatedProfiles') :: json)`),
    'ap'
  )
  .getMany();

注意事项

  • 确保你的数据库(比如PostgreSQL)支持json_array_elements函数,且profile字段是json或jsonb类型;
  • 如果使用TypeORM旧版本,raw()函数的用法可能略有差异,建议对应官方文档调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:58:09