我们如何将 TypeORM ViewEntity 的 ViewColumn 配置为 JSON 类型?

And*_*ger 6 typeorm

我正在@ViewEntity()MySQL 上使用 TypeORM 创建一个,其中直接选择 JSON 列。该视图是正确的,只是一个普通的 SQL 视图。

视图类的列定义如下所示:

@ViewColumn() document: Estimate;

其中Estimate是指定 JSON 数据形状的接口,尽管我Estimate | Object也尝试过。存储库检索到的实体的文档属性始终为 a string,显然 ORM 没有解析 JSON。JSON.parse()因此,在响应请求之前,我必须做一些烦人的事情并改变检索到的记录。

ViewColumnOptions只需要 的 属性,所以我不能像在常规 的 上那样name指定。TypeORM 视图中的 JSON 列是否已实现?我无法在文档或 github 问题上找到结果。{ type: 'json' }@Entity()@Column()

And*_*ger 12

文档中没有很好地介绍这一点。

事实证明,您可以@Column()在视图中使用装饰器,因此我对上述问题的解决方案是将视图的列定义指定为

@Column({ type: 'json' }) document: Estimate;

而不是作为

@ViewColumn() document: Estimate;在原来的问题中。

此外,对于以后可能偶然发现这一点的任何人来说,如果您想针对视图建立关系,则必须在视图中至少修饰一列,以便@PrimaryColumn()TypeORM 正确地制定 SQL。同样,文档中没有涵盖这一点;读完它们后,您可能会相信 only@ViewColumn()在 a 内有效,这是情有可原的@ViewEntity()

您内部的关系@ViewEntity()需要看起来像这样的示例Customer关系:

@ManyToOne(() => Customer)
@JoinColumn({ name: 'customerId' })
customer: Customer;
@ViewColumn() customerId: string;
Run Code Online (Sandbox Code Playgroud)

在上面,我在视图中选择了 SQL别名,您可以看到我必须将其指定为相关实体的属性声明之后的customerId名称。@JoinColumn()@ViewColumn()