typescript - typeorm querybuilder inkluderar tabell som inte är relaterad till frågan?
Jag försöker för närvarande implementera följande fråga i 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
För detta har jag implementerat följande kod i 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")
Men när denna kod körs är frågan som genereras av typeorm felaktig och resulterar i en oändlig fråga som till slut använder 100 % av RAM. Den genererade frågan är:
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
Som du kan se, i FROM-satsen inkluderar den tabellen "apartment_listing" "ApartmentListing" samt underfrågan. Om jag kopierar och klistrar in denna fråga i PgAdmin, hamnar den också i en oändlig fråga, men om jag tar bort den extra tabellen "apartment_listing" "ApartmentListing" från FROM-satsen blir resultatet lyckat och jag får rätt resultat.
Varför inkluderar typeORM detta "apartment_listing" "ApartmentListing",? i min kodimplementation finns det bara ett FROM och det pekar på subfrågan. Hur kan jag bli av med den extra tabellen så att frågan körs framgångsrikt?
Tack på förhand
Svar #1
Jag vet att mycket tid har gått men jag har just stött på detta problem och jag kunde lösa det.
Om du skapar frågebyggaren från ett repository ("ApartmentListing" i ditt fall) verkar det som att det alltid lägger till tabellen i FROM även om du anropar from() utan att lägga till tabellen.
För att undvika detta, skapa bara frågebyggaren från något annat. I ditt fall från chefen:
const mainQuery = this.repository.manager
.createQueryBuilder()
...
