TypeORM中Where Not In查询报错:bigint类型输入语法无效
解决TypeORM软删除时NOT IN参数的类型错误问题
错误原因
你把数组imageIDs用join(',')转成了字符串"1,2,3"传给SQL参数,PostgreSQL会把这个字符串当成单个bigint值解析,自然抛出类型转换错误。
解决方案
有两种简洁的修复方式:
方式1:直接传递数组并使用参数展开语法
不需要手动拼接字符串,直接把数组传给参数,并用:...语法让TypeORM自动展开数组元素:
return manager .getRepository(SlideshowItemEntity) .createQueryBuilder('slideshow_items') .softDelete() .where('image_id NOT IN (:...imageIDs)', { imageIDs }) .andWhere('slideshow_id = :slideshowID', { slideshowID }) .execute();
这种方式会生成正确的SQL:image_id NOT IN ($1, $2, $3),每个数组元素作为独立的bigint参数传入,避免类型错误。
方式2:使用TypeORM查询条件构造器
用TypeORM内置的Not和In构造器,更符合ORM的风格,也能避免手写SQL的失误:
import { Not, In } from 'typeorm'; return manager .getRepository(SlideshowItemEntity) .createQueryBuilder('slideshow_items') .softDelete() .where({ image_id: Not(In(imageIDs)), slideshow_id: slideshowID }) .execute();
额外注意
确保imageIDs是数字类型数组,如果你的数据源返回的是字符串数组,需要先转换:
const numericImageIDs = imageIDs.map(id => Number(id));
内容的提问来源于stack exchange,提问作者Babak Asadzadeh
相关产品推荐
相关产品推荐

