首页 > 解决方案 > typeorm querybuilder包括与查询无关的表?

问题描述

我目前正在尝试在 typeorm 中实现以下查询:

 select id,"createdAt", "updatedAt","deactivatedAt",(EXTRACT(EPOCH FROM "deactivatedAt" - "createdAt")/3600 ) as lifespan
    from (
       select id,"createdAt", "updatedAt","deactivatedAt", (EXTRACT(EPOCH FROM "deactivatedAt" - "createdAt")/3600 )as time
       from apartment_listing where active = false)as subquery
where subquery.time <24

为此,我在 TypeScript 中实现了以下代码:

    const mainQuery = this.repository
      .createQueryBuilder()
      .select("subquery.id", "id")
      .addSelect("subquery.time", "time")
      .addSelect("subquery.created", "createdAt")
      .addSelect("subquery.deactivated", "deactivatedAt")
      .from(qb => {
        const sub = qb.select(
          "(EXTRACT(EPOCH FROM listing.deactivatedAt - listing.createdAt )/3600 )",
          "time"
        )
        .addSelect("listing.deactivatedAt", "deactivated")
        .addSelect("listing.id", "id")
        .addSelect("listing.createdAt", "created")
        .addSelect("listing.active","active")
        .from(this.type, "listing")
        .where("listing.active = false")
        return sub;
      }, "subquery")
      .where("subquery.time < 24")

但是,在执行此代码时,typeorm 生成的查询不正确,并导致无限查询,最终使用 100% 的 ram。生成的查询是:

SELECT subquery.id AS "id", subquery.time AS "time", subquery.created AS "createdAt", subquery.deactivated AS "deactivatedAt" 
FROM "apartment_listing" "ApartmentListing", (SELECT "listing"."id" AS "id", "listing"."active" AS "active", "listing"."createdAt" AS "created", "listing"."deactivatedAt" AS "deactivated", (EXTRACT(EPOCH FROM "listing"."deactivatedAt" - "listing"."createdAt" )/3600 ) AS "time" FROM "apartment_listing" "listing" WHERE "listing"."active" = false) "subquery" 
WHERE subquery.time < 24

如您所见,在 FROM 子句中,它包括"apartment_listing" "ApartmentListing"表和子查询。如果我在 PgAdmin 中复制并粘贴此查询,它也会以无限查询结束,但如果我"apartment_listing" "ApartmentListing",从 FROM 子句中删除那个额外的表,结果是成功的,我得到了正确的结果。

为什么 typeORM 包括这个"apartment_listing" "ApartmentListing",?在我的代码实现中,只有一个 FROM,它指向子查询。我怎样才能摆脱那个额外的表,以便查询成功执行?

提前致谢

标签: typescripttypeorm

解决方案


推荐阅读