Typeorm MySQL中QueryBuilder的LIKE查询报错求助
解决TypeORM QueryBuilder MySQL模糊查询的EntityPropertyNotFoundError问题
问题原因
你遇到的EntityPropertyNotFoundError: Property "search" was not found in "User"错误,是因为TypeORM的QueryBuilder在解析手写SQL字符串条件时,误将:search识别为User实体的属性字段,而非查询参数。
可行解决方案
方案1:使用TypeORM内置的参数绑定写法(推荐)
显式拆分条件字符串与参数绑定,让QueryBuilder明确识别参数:
const users = await this.userRepository .createQueryBuilder() .select(['firstName', 'lastName']) .where('LOWER(firstName) LIKE :search') .setParameter('search', `%${query.search.toLowerCase()}%`) .getRawMany();
方案2:用TypeORM的Like操作符构建查询
借助TypeORM提供的Like函数,避免手写SQL字符串的解析问题:
import { Like } from "typeorm"; const searchKeyword = `%${query.search.toLowerCase()}%`; const users = await this.userRepository .createQueryBuilder() .select(['firstName', 'lastName']) .where({ firstName: Like(searchKeyword) }) .getRawMany();
方案3:给参数名添加反引号标记
如果坚持在同一行写条件与参数,可给参数名包裹反引号,避免被误解析为实体属性:
const users = await this.userRepository .createQueryBuilder() .select(['firstName', 'lastName']) .where('LOWER(firstName) LIKE `:search`', { search: `%${query.search.toLowerCase()}%`, }) .getRawMany();
验证提示
测试时确保query.search不为空值,避免生成%%这类无意义的模糊查询条件,同时确认firstName确实是User实体中映射到数据库的字段名。
内容的提问来源于stack exchange,提问作者Yousaf Sabir
相关产品推荐
相关产品推荐

