TypeOrm ViewEntity 查询不正确

甲虫汁

我正在关注有关如何创建ViewEntity的 TypeOrm 文档,以便我可以生成和查询我的数据库的自定义视图。但是在运行时,生成的 SQL 不是我所期望的。文档提到馈送的表达式@ViewEntity()可以是查询。这是我的模型:

@ViewEntity({
  expression: `
SELECT t1.*, t1.CountOfA + t1.CountOfB AS Total
FROM (
SELECT q.CountOfA, q.CountOfB
FROM questions q
) AS t1`
})
export class CountViewEntity {
  @ViewColumn()
  CountOfA: number;

  @ViewColumn()
  CountOfB: number;

  @ViewColumn()
  Total: number;
}

所以我希望它Repository<CountViewEntity>会为我的questions表中的每一行提供一个包含 CountOfA、CountOfB 和 Total 的记录所以我执行这个:

this.countViewRepository.find();

但是会生成以下 SQL:

选择CountViewEntityCountOfAAS CountViewEntity_CountOfACountViewEntityCountOfBAS CountViewEntity_CountOfBCountViewEntityTotalAS CountViewEntity_TotalFROMcount_view_entity CountViewEntity

我收到关于表count_view_entity不存在的错误

我究竟做错了什么?

编辑:

嗯......自从我悬赏以来已经有一天了,我收到的答案/评论让我想到:我是 MySQL 新手和 TypeORM 新手,所以也许我只是忽略了 TypeORM 文档所做的假设。我认为生成的 SQL 会查询实际的数据库表,但我只是重新阅读了文档,特别是这部分:

视图实体是映射到数据库视图的类

以前它对我没有任何意义,但我刚刚遇到了一个叫做Database View 的东西也许我应该先创建一个然后再查询?再次乐观起来……

维涅什·库马尔

视图实体是一个映射到数据库视图的类。你可以通过定义一个新类来创建一个视图实体并用以下标记@ViewEntity()

根据帖子所有者更新

显然,您必须先创建数据库视图,然后才能从 调用它TypeORM,这会导致错误count_view_entity not existing

@ViewEntity() 接受以下选项:

  • name- 查看名称。如果未指定,则从实体类名称生成视图名称。
  • database - 所选数据库服务器中的数据库名称。
  • schema - 架构名称。
  • expression- 视图定义。必需参数

expression 可以是带有正确转义的列和表的字符串,取决于使用的数据库。

尝试如下

@ViewEntity({
         expression: `
           SELECT t1.*, t1.CountOfA + t1.CountOfB AS Total
           FROM (
                SELECT q.CountOfA, q.CountOfB
                FROM questions q
               ) AS t1`
      })

export class CountViewEntity {

  @ViewColumn()
  CountOfA: number;

  @ViewColumn()
  CountOfB: number;

  @ViewColumn()
  Total: number;
}

您真的需要吗,Sub Query因为在外部选择中选择相同的结果毫无意义。

 @ViewEntity({
        expression: `
            SELECT "t1"."CountOfA" AS "CountOfA", "t1"."CountOfB" AS "CountOfB",
                   "t1"."CountOfA" + "t1"."CountOfB" AS "Total"
            FROM "questions" "t1"
               `
            })

此外,您可以使用 QueryBuilder

@ViewEntity({ 
    expression: (connection: Connection) => connection.createQueryBuilder()
        .select("t1.CountOfA", "CountOfA")
        .addSelect("t1.CountOfB", "CountOfB")
        .addSelect("t1.CountOfA" + "t1.CountOfB", "Total")
        .from(questions, "t1")
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章