使用TypeORM查询Postgres时出现double precision语法错误
解决TypeORM搭配PostgreSQL使用MoreThanOrEqual时的类型转换报错问题
在NestJS项目中使用TypeORM操作PostgreSQL的offers表时,字段定义如下:
@Column({ type: 'float', nullable: false }) totalTradingAmount: number;
直接使用数值进行比较查询时可以正常运行:
offersQuery.andWhere("offers.totalTradingAmount >= CAST(:totalTradingAmount AS FLOAT)", { totalTradingAmount: 40 })
但将MoreThanOrEqual函数作为参数值传入时,会触发PostgreSQL报错:invalid input syntax for type double precision,即使把数值改为40.0也无法解决:
offersQuery.andWhere("offers.totalTradingAmount >= CAST(:totalTradingAmount AS FLOAT)", { totalTradingAmount: MoreThanOrEqual(40) })
问题原因
MoreThanOrEqual是TypeORM提供的查询条件构造器,它本身会生成包含比较运算符的SQL片段。如果把它作为参数值传给CAST函数,TypeORM会将这个函数对象序列化成字符串(比如"[object Object]"),PostgreSQL尝试将这个字符串转换为浮点数时自然会报错。
正确用法
方式一:直接使用MoreThanOrEqual构造条件(推荐)
TypeORM会根据实体字段的类型自动处理类型匹配,无需手动CAST:
// 写法1:使用字符串条件 offersQuery.andWhere("offers.totalTradingAmount >= :totalTradingAmount", { totalTradingAmount: MoreThanOrEqual(40) }); // 写法2:使用对象式条件(更简洁) offersQuery.andWhere({ totalTradingAmount: MoreThanOrEqual(40) });
方式二:特殊场景下手动处理类型
如果确实需要手动进行类型转换,不要将MoreThanOrEqual作为参数值,而是直接编写条件逻辑:
// 直接传入数值并手动CAST offersQuery.andWhere( "offers.totalTradingAmount >= CAST(:value AS FLOAT)", { value: 40 } ); // 或者结合Raw函数实现自定义条件 offersQuery.andWhere(Raw(alias => `${alias} >= CAST(:value AS FLOAT)`, { value: 40 }));
内容的提问来源于stack exchange,提问作者Faisal Anwar
相关产品推荐
相关产品推荐

