TypeORM子查询

基于使用子查询的typeORM文档,介绍了如何创建子查询。例子:

const qb = await getRepository(Post).createQueryBuilder("post");

const posts = qb

.where("post.title IN " + qb.subQuery().select("user.name").from(User, "user").where("user.registered = :registered").getQuery())

.setParameter("registered", true)

.getMany();

但是,对于SQL来说,这是等效的。

假设我有包含如下子查询的查询:

SELECT a, TO_CHAR (MAX (jointable.f), 'MON YYYY') as f,

t3.c, t3.d, t1.e

FROM table1 t1

LEFT JOIN table2 t2 ON t2.e = t1.e

JOIN table3 t3 ON t3.d = t2.d

JOIN

(SELECT f, t4.g, t5.e, t6.h

FROM table4 t4

JOIN table5 t5 ON t4.g = t5.g

JOIN table6 t6 ON t6.g = t4.g

AND (t6.i = 2

OR (t6.i = 1 AND j = 1)

)

WHERE t4.k = 4

) jointable ON t1.e = jointable.e

WHERE jointable.h = :h

AND(:d = 3 OR

t3."d" = :d

)

GROUP BY a, t3.c, t3.d, t1.e

ORDER BY a ASC

对于上面的SQL查询,我应该如何使用typeORM查询生成器功能?

假设我已经创建了与上面查询中使用的所有表相关的实体。

回答:

我希望这个答案可以帮助其他人使用TypeORM子查询。

const subquery = await getManager()

.createQueryBuilder(table4, 't4')

.select('"t4".f')

.addSelect('"t4".g')

.addSelect('"t5".e')

.addSelect('"t6".h')

.innerJoin(table5, 't5', '"t4".g = "t5".g')

.innerJoin(table6, 't6', '"t6".g = "t4".g')

.where('"t4".k = 4 AND ("t6".i = 2 OR ("t6".i = 1 AND "t6".j = 1))');

model = await getManager()

.createQueryBuilder(table1, 't1')

.select('"t1".a')

.addSelect("TO_CHAR (MAX (jointable.f), 'MON YYYY')", 'f')

.addSelect('"t3".c')

.addSelect('"t3".d')

.addSelect('"t1".e')

.leftJoin('table2', 't2', '"t2".e = "t1".e')

.innerJoin(table3, 't3', '"t3".d = "t2".d')

.innerJoin('('+subquery.getQuery()+')', 'jointable', '"t1".e = jointable.e')

.where('jointable.h = :h AND (:d = 3 OR "t3".d = :d)',

{ h: h, d: d })

.groupBy('"t1".a, "t3".c, "t3".d, "t1".e')

.orderBy('"t1".a', 'ASC')

.getRawMany();

'('+subquery.getQuery()+')'用来获取子查询的选择查询等效于

(选择f,t4.g,t5.e,t6.h…。

......

....)可连接ON t1.e =可连接

根据我的理解:

  • Join实际上 等于innerjoin

  • .select``select在SQL中等于和。您也可以添加 aliases(如SQL中一样)。

  • .addSelect 类似于 , in select

  • 使用选择查询构建器可以得到两种类型的结果:实体或原始结果。描述您是否要将数据作为实体(getOnegetMany)或作为实体(getRawOnegetRawMany)。

以上是 TypeORM子查询 的全部内容, 来源链接: utcz.com/qa/400018.html

回到顶部