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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:41:04