typescript - typeorm クエリビルダーで、クエリに関連していないテーブルを含めるには?
私は現在、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によって生成されるクエリが正しくなく、無限クエリとなり、最終的にRAMを100%使用してしまいます。生成されるクエリは次の通りです:
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にコピーして貼り付けると、無限クエリになってしまいますが、FROM句からその余分な "apartment_listing" "ApartmentListing" テーブルを削除すると、結果は正常に取得でき、正しい結果が得られます。
なぜtypeORMはこの "apartment_listing" "ApartmentListing", を含めているのですか?私のコードの実装ではFROMは一つだけで、それはサブクエリを指しています。どのようにしてその余分なテーブルを取り除き、クエリが正常に実行されるようにできますか?
よろしくお願いします
回答 #1
時間がかなり経ったことは分かっていますが、私はちょうどこの問題に遭遇し、修正することができました。
もしリポジトリ(あなたの場合は「ApartmentListing」)からクエリビルダーを作成すると、from() を呼び出してテーブルを追加しなくても、常に FROM にテーブルが追加されるようです。
これを避けるには、クエリビルダーを別のものから作成してください。あなたの場合はマネージャーからです:
const mainQuery = this.repository.manager
.createQueryBuilder()
...
