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

