如何将TypeORM查询构建器返回对象转为Slot实体?解决字段映射问题
解决TypeORM QueryBuilder更新后下划线字段无法映射到驼峰实体的问题
当使用TypeORM QueryBuilder执行更新并返回数据时,返回的结果是数据库原始下划线命名的字段(如test_id),而Repository.create()方法只会直接将对象属性赋值给实体实例,不会处理数据库列名与实体驼峰字段的映射,导致这类字段无法正确赋值。
解决方案:使用class-transformer的plainToInstance方法
TypeORM依赖class-transformer处理实体与普通对象的转换,该工具可以根据实体的@Column装饰器配置自动完成下划线到驼峰的字段映射。
步骤1:确保实体字段配置正确
首先确认你的Slot实体中,下划线对应的驼峰字段已通过@Column的name属性指定数据库列名:
import { Entity, Column } from "typeorm"; @Entity() export class Slot { // 示例字段配置 @Column({ name: 'start_date' }) startDate: Date; @Column({ name: 'test_id' }) testId: string; status: string; voidReason: string; // 其他字段... }
步骤2:转换返回结果为实体实例
在执行QueryBuilder更新后,使用plainToInstance将原始数据库结果转换为Slot实体实例:
import { plainToInstance } from "class-transformer"; import { Slot } from "./path-to-slot-entity"; const updateResult = await Slot .createQueryBuilder() .update(Slot) .set({ status: 'void', voidReason: 'Billing - incomplete verification' }) .where("start_date > NOW() - INTERVAL '14 days'") .andWhere("status = 'void'") .returning("*") .execute(); // 将原始结果转换为Slot实体数组 const slotEntities = plainToInstance(Slot, updateResult.raw);
原理说明
plainToInstance会读取实体类的元数据(即@Column装饰器中配置的name属性),自动将数据库返回的下划线命名字段映射到实体的驼峰命名属性上,完美解决字段名不匹配的问题。
内容的提问来源于stack exchange,提问作者Rafael Polonio
相关产品推荐
相关产品推荐

