如何从不是数据库中的列的实体中返回额外的字段?

Posted

技术标签:

【中文标题】如何从不是数据库中的列的实体中返回额外的字段?【英文标题】:How to return additionally field from entity which is not a column in database? 【发布时间】:2020-11-05 18:25:06 【问题描述】:

我有一个带有多个字段的实体,带有注释@Column,如下所示:

@Entity()
export class User 
  @PrimaryGeneratedColumn()
  id!: number;

  @Column(
    type: 'varchar',
  )
  firstName: string;

  @Column(
    type: 'varchar',
  )
  lastName: string;

当保存后我返回保存的对象时,他只返回这三个字段,但我想返回另一个字段:fullName 但我不想将其保存在数据库中

所以,我尝试在 eneity 中添加这个字段:

fullName: string;

但是当我在这个字段上映射我的text 并返回这个对象时,然后返回我所有但不返回我的全名,有人可以告诉我如何从不是数据库中的列的实体中返回额外的字段吗?

【问题讨论】:

【参考方案1】:

您可以将此部分添加到您的实体中:

fullName: string; // just define a property to use it in afterLoad method

@AfterLoad() // this method will be called on each entity query
afterLoad() 
    this.fullName = `$this. firstName $this.lastName`;

【讨论】:

hmmm 但是如果我想设置我的全名不是在实体中而是在不同的类中服务呢? @ertyjdjgdfgj 您可以尝试添加这样的选择 (查询生成器示例).select(['CONCAT(firstName, ' ', lastName) as fullName']),但我不确定它是否可以在正确的方式【参考方案2】:

您可以创建一个代表最终数据的类型,例如:

type CustomUser = 
   id: number;
   firstName: string;
   lastName: string;
   fullName: string;

之后,让您的查询返回此类型

  return getManager()
    .createQueryBuilder(User, 'user')
            .select('user.id', 'id')
            .select('user.firstName', 'firstName')
            .addSelect('user.lastName', 'lastName')
            .addSelect('CONCAT(firstName, ' ', lastName', 'fullName')      
            .getRawMany();

// getRawMany() if you want to fetch many records or getRawOne()

如果您只需要所有用户的 fullName 列,您可以尝试:

const  fullName  = await getManager()
        .createQueryBuilder(User, 'user').select('CONCAT(firstName, ' ', 
        lastName', 'fullName').getRawMany();
return fullName;

【讨论】:

以上是关于如何从不是数据库中的列的实体中返回额外的字段?的主要内容,如果未能解决你的问题,请参考以下文章

从数据框中删除不包括一组列的列中的nan行。

如何从 Python 中的数据中删除多余的逗号

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回

如何向 symfony 2 表单添加一些额外的数据

如何在不先定义表中的列的情况下将数据加载到 PostgreSQL 中?

Spring boot JPA - 使用额外的列查询多对多