我正在关注有关如何创建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:
选择
CountViewEntity
。CountOfA
ASCountViewEntity_CountOfA
,CountViewEntity
。CountOfB
ASCountViewEntity_CountOfB
,CountViewEntity
。Total
ASCountViewEntity_Total
FROMcount_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] 删除。
我来说两句