You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:35:15