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

如何在TypeORM查询构造器的join中使用原生PostgreSQL函数?

TypeORM中使用PostgreSQL jsonb_each作为JOIN源避免被自动加双引号的解决方法

TypeORM默认会对JOIN方法传入的表名/关联字段做标识符转义,自动添加双引号,防止SQL注入。要让jsonb_each这类函数表达式不被转义,可以用以下两种方案:

方案1:使用leftJoinRaw方法(推荐)

TypeORM提供了原生JOIN专用方法,不会对传入的第一个SQL片段做转义处理,直接生成原生SQL:

const result = await this.customersRepository
  .createQueryBuilder('c')
  // 第一个参数为原生JOIN表达式,第二个参数为别名
  .leftJoinRaw('jsonb_each(c.some_json_column)', 'd')
  .select(['c.*', 'd.key', 'd.value'])
  .getMany();

生成的SQL和预期效果完全一致:select * from customers c left join jsonb_each(c.some_json_column) as d

方案2:用Raw函数包裹表达式

如果要使用普通的leftJoin方法,可以用TypeORM导出的Raw工具函数标记原生SQL片段,通知TypeORM跳过转义:

import { Raw } from 'typeorm';

// ...
const result = await this.customersRepository
  .createQueryBuilder('c')
  .leftJoin(
    Raw(() => 'jsonb_each(c.some_json_column)'),
    'd'
  )
  .select(['c.*', 'd.key', 'd.value'])
  .getMany();

注意事项

如果原生SQL片段中需要传入外部动态参数,不要直接拼接字符串避免SQL注入风险,使用TypeORM的参数绑定机制即可:

.leftJoinRaw(
  'jsonb_each(c.some_json_column) d ON d.value = :filterValue',
  { filterValue: '待匹配的动态值' }
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:15:00