Sql 如何使用typeORM生成复杂的嵌套where条件?

Sql 如何使用typeORM生成复杂的嵌套where条件?,sql,typescript,typeorm,Sql,Typescript,Typeorm,我有多个嵌套的where条件,并希望生成它们而不需要太多的typeORM代码重复 SQL where条件应如下所示: 其中“表”。“id”=$1 及 表“.notAvailable”为空 及 ( “表”。“日期”>2美元 或 ( “表”。“日期”=$2 及 “表”。“myId”>3美元 ) ) 及 ( “表”。“已创建”=$2 或 “表”。“已更新”=$4 ) 及 ( “表”“文本”类似于“%search%” 或 表“.name”类似于“%search%” ) 但是使用FindConditio

我有多个嵌套的where条件,并希望生成它们而不需要太多的typeORM代码重复

SQL where条件应如下所示:

其中“表”。“id”=$1
及
表“.notAvailable”为空
及
(
“表”。“日期”>2美元
或
(
“表”。“日期”=$2
及
“表”。“myId”>3美元
)
)
及
(
“表”。“已创建”=$2
或
“表”。“已更新”=$4
)
及
(
“表”“文本”类似于“%search%”
或
表“.name”类似于“%search%”
)
但是使用
FindConditions
似乎不可能使它们嵌套,因此我必须在FindConditions数组中使用
的所有可能组合。而且不可能将其拆分为
。where()
。而where()
导致
和where
不能使用对象文字


有没有另外一种方法可以在不使用原始SQL的情况下使用typeORM实现此查询?

我认为您混合了从typeORM中检索实体的两种方法,即从存储库和查询生成器。
find条件
用于find函数。查询生成器使用
和where
函数。在生成更复杂的查询时,通常使用查询生成器会更好/更容易


使用查询构建时,您可以更自由地确保查询是您所需要的。使用,您可以随意添加任何SQL:

const desiredEntity = await connection
  .getRepository(User)
  .createQueryBuilder("user")
  .where("user.id = :id", { id: 1 })
  .andWhere("user.date > :date OR (user.date = :date AND user.myId = :myId)",
    { 
      date: specificCreatedAtDate,
      myId: mysteryId,
    })
  .getOne();
请注意,根据使用的数据库,此处使用的实际SQL需要兼容。这也可能导致使用这种方法的倒退。您将把项目绑定到特定的数据库。如果您正在使用关系,请务必阅读有关您可以设置的表的信息,这将非常方便


你已经看到,这是不太舒服。这是因为
find
函数或更具体的
findOptions
正在使用对象构建where子句。这使得实现适当的接口来同时实现嵌套的
子句变得更加困难。(我假设)他们选择了拆分
以及
子句。这使接口更具声明性,意味着您必须将
子句置于顶部:

const desiredEntity = await repository.find({
  where: [{
    id: id,
    notAvailable: Not(IsNull()),
    date: MoreThan(date)
  },{
    id: id,
    notAvailable: Not(IsNull()),
    date: date
    myId: myId
  }]
})
我无法想象看到一个与所需查询大小相同的查询,这段代码的性能会非常好


或者,您可以使用
Raw
find助手。这将要求您为每个字段重写子句,因为您一次只能访问一个别名。您可以猜测列名或别名,但这将是非常糟糕的做法,而且非常不稳定,因为您无法轻松直接控制它。

您可能希望使用不起作用或没有给出预期结果的代码示例来改进您的问题。此外,建议始终共享相关实体(部分)并拥有您要从中调用此查询的当前代码段