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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:07:37