我正在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问题上找到结果。
答案 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()
相关实体的声明。