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

TypeORM如何对关联实体ID等数值类型字段使用LIKE模糊查询

问题根因

报错QueryFailedError: operator does not exist: integer ~~ unknown是数据库层面的类型不匹配导致的:

  • beneficiary 关联对应的底层外键是整数类型,而LIKE是字符串专属的模糊匹配操作符,默认无法直接作用于数值类型字段。
  • 直接传固定字符串'3'能正常运行,是因为TypeORM会自动将传入的字符串转为整数和数值字段匹配,不会触发操作符冲突。

可用解决方案

方案1:通过Raw函数手动转类型后匹配(通用性最强)

你可以用TypeORM内置的Raw函数,先将数值类型的外键字段转为字符串,再执行LIKE匹配:

import { Raw, Like } from 'typeorm';

const matchStr = '%35%'; // 你的模糊匹配值
const [settings, totalSettings] = await getRepository(Settings).findAndCount({
  loadRelationIds: true,
  where: {
    transport: Like('%bike%'),
    // PostgreSQL 写法,MySQL 替换 CAST 语法为 CAST(${alias} AS CHAR) 即可
    beneficiary: Raw((alias) => `CAST(${alias} AS VARCHAR) LIKE :match`, { match: matchStr })
  }
})

参数化写法可以避免SQL注入风险,更安全。

方案2:改用数值范围查询(性能最优)

如果你的匹配需求只是匹配ID的前缀,完全可以用数值操作符替代模糊查询,避免类型转换带来的性能损耗:

// 匹配35开头的两位前缀ID,范围对应350~359
const [settings, totalSettings] = await getRepository(Settings).findAndCount({
  loadRelationIds: true,
  where: {
    transport: Like('%bike%'),
    beneficiary: Between(350, 359)
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 00:48:03