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

时间:2020-10-10 19:10:42

标签: typeorm

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

视图类的列定义如下:

@ViewColumn() document: Estimate;

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

ViewColumnOptions仅具有name的属性,因此我无法像在常规{ type: 'json' }的{​​{1}}上那样指定@Entity()。 TypeORM视图中的JSON列甚至实现了吗?我一直无法在文档或github问题上找到结果。

1 个答案:

答案 0 :(得分:0)

这在文档中没有很好地覆盖。

原来,您只能在视图中使用@Column()装饰器,因此上述解决方案是将视图的列定义指定为

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

代替as

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

此外,对于以后可能偶然发现此问题的任何人,如果要与视图建立关系,则必须将视图中的至少一列装饰为@PrimaryColumn(),以便TypeORM正确地编写SQL。同样,这不在文档中;您可能会因为阅读@ViewColumn()@ViewEntity()中才有效而被原谅。

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

@ManyToOne(() => Customer)
@JoinColumn({ name: 'customerId' })
customer: Customer;
@ViewColumn() customerId: string;

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