当前位置: 首页 > 面试题库 >

TypeORM子查询

支洋
2023-03-14
问题内容

基于使用子查询的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实际上 等于inner join

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

  • .addSelect 类似于 , in select

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



 类似资料:
  • 我想不出如何使用TypeOrm查询生成器编写以下MySql语句 从farm.reg中选择reg.id,其中grpId=“abc”; 这个选择返回的只是ID的,但我的查询生成器返回的是整个对象。 现在,我在我的NestJs服务中有这个函数,但我需要使用'map',我不想… 谢谢

  • 我有一个使用TypeORM包与Postgres SQL交互的nestjs应用程序。 我有下面的代码, 对于键和用户实体,我需要将内部连接创建为 选择*FROM key INNER JOIN user ON key.id=user.“keyid”,其中user.“userid”=1; 如何使用typeorm编写等效的内部联接查询? 如何使用typeorm执行上面的SQL查询?

  • TypeORM 是一个优秀的 Node.js ORM 框架,采用 TypeScript 编写,支持使用 TypeScript 或 Javascript(ES5,ES6,ES7) 开发。目标是保持支持最新的 Javascript 特性来帮助开发各种用户数据库的应用 - 不管是轻应用还是企业级的。 TypeORM 可以做到: 根据模型自动创建数据库表 可以透明的插入/更新/删除数据库对象 映射数据库

  • 在我的NestJS项目中,我有这个TypeORM查询: 现在我只想返回名称中包含的用户。在SQL中,这将是一个查询。 在https://github.com/typeorm/typeorm/blob/master/docs/find-options.md中,没有关于通配符查询的信息。 如何执行like查询类型ORM给出了一个解决方案: 但是,我无法使用和,后者在使用而不是时可用。 对于如何使用Ty

  • 一个user有多个tel,是一对多的关系,现在我只需要查最新的一条即可,没必要把tel全查出来,应该怎么写?

  • GraphQL - TypeORM - Koa workshop This is a demo app for my medium post on creating GraphQL APIs. yarn install && yarn start