TypeORM中andWhere导致查询失效的原因是什么?
解决TypeORM QueryBuilder中用户隔离条件失效问题
你遇到的问题是SQL运算符优先级导致的:AND的优先级高于OR,当前的查询语句会被数据库解析成:
media.userId = ? AND LOWER(media.title) LIKE ? OR LOWER(media.description) LIKE ?
实际执行逻辑变成了(userId匹配 且 标题匹配) 或 描述匹配,这就导致只要描述符合搜索条件,不管userId是否匹配都会被返回,直接绕过了用户隔离的限制。
修复方案
把OR组合的搜索条件用括号包裹,确保userId条件和整个搜索条件是严格的AND关系:
public async search(userId: string, query: { search: string }) { const queryBuilder = this.dataSource.createQueryBuilder( MediaEntity, "media", ); queryBuilder .where("media.userId = :userId", { userId }) .andWhere( "(LOWER(media.title) LIKE :s OR LOWER(media.description) LIKE :s)", { s: `%${query.search.toLocaleLowerCase()}%`, }, ); return await queryBuilder.getMany(); }
逻辑说明
修改后的SQL会被解析为:
media.userId = ? AND (LOWER(media.title) LIKE ? OR LOWER(media.description) LIKE ?)
数据库会先执行括号内的OR逻辑(标题匹配 或 描述匹配),再将结果与userId匹配条件做AND运算,确保只有指定用户的媒体数据中符合搜索条件的内容才会被返回。
内容的提问来源于stack exchange,提问作者Aaron Balthaser
相关产品推荐
相关产品推荐

