Nestjs TypeForm-不带“的左连接;deletedAt为空";

Nestjs TypeForm-不带“的左连接;deletedAt为空";,nestjs,typeorm,Nestjs,Typeorm,搜索这个已经有一段时间了,不确定这是否是SQL世界中的非正统内容,但我正在尝试使用NOTNULL“deletedAt”列进行左连接,但我似乎找不到一种方法来执行包含删除的左连接 这只是一个虚拟示例,说明了我正在尝试做的事情,在这种情况下,我希望检索人员信息以及作业信息,但作业已被软删除 this.createQueryBuilder('person') .leftJoinAndSelect('person.job', 'job') 此操作生成的SQL查询在左连接上隐式添加了“IS NOT

搜索这个已经有一段时间了,不确定这是否是SQL世界中的非正统内容,但我正在尝试使用NOTNULL“deletedAt”列进行左连接,但我似乎找不到一种方法来执行包含删除的左连接

这只是一个虚拟示例,说明了我正在尝试做的事情,在这种情况下,我希望检索人员信息以及作业信息,但作业已被软删除

this.createQueryBuilder('person')
  .leftJoinAndSelect('person.job', 'job')
此操作生成的SQL查询在左连接上隐式添加了“IS NOT NULL”,但我有一个场景,需要从确实已删除的记录中获取信息

我还没有找到一种方法来包含它,就像你在根级别通过包含来做的那样

.withDeleted();

有人有什么建议吗?

在我的测试中,TypeOrm会根据
.withDeleted()
是在
之前还是之后生成不同的查询。leftJoinAndSelect()

因此,如果您想排除软删除的“人员”,但包括软删除的“作业”(我希望如此),您可以在加入之前使用withDeleted(这将包括所有内容),然后添加自己的条件以排除软删除的“人员”(即添加条件
“Person.deletedAt为NULL”
)。这样,您就不需要执行完整的原始查询:

// 'withDeleted() before the join with extra condition: Exclude soft-deleted 'Person' BUT INCLUDE soft-deleted 'Job':
        this.createQueryBuilder("Person")
        .withDeleted()
        .andWhere("Person.deletedAt Is Null")
        .leftJoinAndSelect('Person.job', 'Job');

(我使用TypeORM 0.2.30和0.2.31进行了测试,发现了相同的行为)。

尝试使用.getRaw方法或this.repository.manager.createQueryBuilder(),第二种方法必须指定from子句和所选字段。您好@Edward,感谢您的回复。我正在使用TypeORM 0.2.31,它似乎是您链接的线程的版本!根据日志记录(幸运的是我已经使用了日志记录),查询总是打印“和”作业“。deletedAt”为空。我正在使用getMany进行查询:this.createQueryBuilder('person').leftJoinAndSelect('person.job','job').getMany();我正在使用postgres。我注意到了变化,它可能是元数据吗?再次您好@FPJ:我完全错了:它确实添加了“job”和“deletedAt”,正如您所说,“deletedAt”是空的。对我来说,这似乎是不好的行为,不是我所期望的,我在测试时错过了它——我想我看到了我想看到的!类型0.2.30和0.2.31的行为相同。我将编辑我的答案,以建议解决方法。嘿,再次@Edward。很好,如果我没有弄错的话,这种行为似乎是新的。不幸的是,这种变通方法不起作用。withDeleted应用于“Person”,我实际上希望它添加到“Job”中。到目前为止,我发现唯一的解决方法是进行原始查询(因为我的实际查询非常大),这完全违背了TypeORM的目的:(我只是不明白为什么我找不到一个简单地关闭左连接所应用的隐式条件的选项…你好@FPJ:I再次更改了我的答案-生成的查询似乎取决于您放置的位置。withDeleted()。我希望你能用我最后的想法让它为你工作。我相信我错过了withDeleted定位的测试。我已经求助于恢复到0.2.30,因为我即将发布,希望一切都稳定,但我衷心感谢你的解释,因为我将把它带到我的下一次更新。我不确定为什么会有这么大的变化但我相信这是有道理的。非常感谢你的努力,你帮了我很大的忙!
// 'withDeleted() before the join with extra condition: Exclude soft-deleted 'Person' BUT INCLUDE soft-deleted 'Job':
        this.createQueryBuilder("Person")
        .withDeleted()
        .andWhere("Person.deletedAt Is Null")
        .leftJoinAndSelect('Person.job', 'Job');