首页 > 解决方案 > 如何使用 innerJoinAndSelect 服务加入 typeORM 中的表

问题描述

实体-pin

@Entity()
export class Pin {
  @PrimaryGeneratedColumn()
  @PrimaryColumn()
  id: string;

  @Column({name: 'town_name'})
  townName: string;

  @Column()
  state_id: string;

  @ManyToOne(() => State, state => state.stateId)
  state: State;
}

实体状态

@Entity()
export class State {

  @PrimaryGeneratedColumn({name: 'state_id'})
  @PrimaryColumn()
  stateId: string;

  @Column({name: 'state_name'})
  stateName: string;

}

服务:

const pin = pinRepository.createQueryBuilder('pin').leftJoinAndSelect('pin.state','state').getQuery();
    console.log(pin);

我是 Nest 和 typeORM 的新手,并尝试加入这两个表。但它返回错误的查询:

SELECT "pin"."id" AS "pin_id","pin"."town_name" AS "pin_town_name", "pin"."state_id" AS "pin_state_id", "pin"."stateStateId" AS "pin_stateStateId", "state"."stateId" AS "state_stateId", "state"."state_name" AS "state_state_name" FROM "pin" "pin" LEFT JOIN "state" "state" ON "state"."stateId"="pin"."stateStateId"

虽然我想要这样的查询:

select id, town_name, Pin.state_id, state_name from Pin inner join State ON Pin.state_id = State.state_id

我在哪一部分通过了错误的事情?或者有什么办法可以克服这个问题。

标签: node.jstypescriptnestjstypeorm

解决方案


我不确定您正在努力解决什么问题,但以下应该有效。我认为问题出在实体关系定义中。

看看@JoinColumn

// pin.entity.ts

@Entity()
export class Pin {
  @PrimaryGeneratedColumn()
  id: string;

  @Column({name: 'town_name'})
  townName: string;

  @Column()
  state_id: string;

  @ManyToOne(() => State, state => state.pins)
  @JoinColumn({ name: 'state_id' })
  state: State;
}
// state.entity.ts

@Entity()
export class State {

  @PrimaryGeneratedColumn({name: 'state_id'})
  stateId: string;

  @Column({name: 'state_name'})
  stateName: string;

  @OneToMany(() => Pin, pin => pin.state)
  pins: Pin[]

}

另外,将左侧更改为内部联接。

const pin = await pinRepository.createQueryBuilder('pin')
.innerJoinAndSelect('pin.state','state')
.getMany()
  

推荐阅读