如何在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
相关产品推荐
相关产品推荐

