在整数列上使用 Like 运算符进行过滤

问题描述

我将 mikro-orm 用于与数据库相关的操作。我的数据库实体有一个数字字段:

@Property({ defaultRaw: 'srNumber',type: 'number' })
 srNumber!: number;

和对应的db列(Postgresql)是:

srNumber(int8)

wheremikro-orm EntityRepository's findAndCount(where,option) 参数的查询输入为:

repository.findAndCount({"srNumber":{"$like":"%1000%"}},options)

翻译成:

select * from table1 where srNumber like '%1000%'

这里的问题是由于 srNumber 列不是字符串,因此存在类型不匹配并且查询失败。像 CAST(srNumber AS TEXT) like '%1000%' 一样投射它应该在 db 中工作。

有什么办法可以在此处以某种方式指定字段转换吗?

解决方法

您可以在查询中使用自定义 SQL 片段。要绕过严格类型的 FilterQuery,您可以使用 expr,它只是一个身份函数(返回其参数),因此仅对 TS 检查有效。

这样的事情应该可以工作:

import { expr } from '@mikro-orm/core';

const res = await repo.findAndCount({
  [expr('cast(srNumber as text)')]: { $like: '%1000%' },},options);

https://mikro-orm.io/docs/entity-manager/#using-custom-sql-fragments