我正在使用 TypeORM 進行兩個專案。在其中一個專案中,當我使用查詢生成器選擇資料并且查詢包含一個聯接時,生成的查詢不包含聯接條件,生成的查詢如下:
SELECT *
FROM `alarms`.`faultLog` `fl`。
INNER JOIN `alarms`.`alarm` `a`。
這就得到了2 543 922個結果,而不是預期的1743個結果。
使用的查詢:
return this.faultsRepository.
.createQueryBuilder('fl'/span>)
.innerJoin('fl.alarm', 'a')
.getRawMany()。
如果我把條件作為innerjoin函式的第三個引數,那么就會出現以下無效的查詢:
SELECT *
FROM `alarms`.`faultLog` `fl`。
INNER JOIN `alarms`.`alarm` `a`。
ON AND (`a`.`id` = Fl.alarmId)
如果我把查詢中的屬性名稱改為alarm而不是fl.alarm,那么生成的查詢就可以了。
在另一個專案中,我有一個類似的查詢,它不構成一個問題,其中生成的查詢包含連接條件:
return this._recipeRepository.
.createQueryBuilder('r'/span>)
.innerJoin('r.type', 'rType')
.innerJoin('r.設備', 'eq')
.innerJoin('r.version', 'rVers')
.select([
'r.id as id'。
'r.name as name'。
'rType.name as type'。
'r.SKU as sku'。
'r.description as description'。
'rVers.id as versionId'。
'rVers.versionNumber as version'.
])
.getRawMany()。
我在TypeORM初始化和版本庫配置中進行了檢查,一切似乎都是等同的,所以我不明白這里發生了什么。
修剪后的物體:
@Entity({
name: "alarm"。
database: 'alarms',
synchronize: false,
})
出口類AlarmEntity {
@PrimaryGeneratedColumn({
name: 'id',
type: 'integer'@Generated('augment')
id: 數字。
@Column({
name: 'description',
type: 'varchar',
length: '200'。
})
description: string;
@OneToMany(
() => FaultLogEntity,
faultLog => faultLog.報警。
{
cascade: true
}
)
faultLogs: FaultLogEntity[]。
}
@Entity({
name: "faultLog"/span>,
database: 'alarms',
synchronize: false
})
輸出類FaultLogEntity {
@PrimaryGeneratedColumn({
name: 'id',
type: 'integer'id: 數字。
@Column({type: 'datetime'})
timestampAppearance:日期。
@OneToMany(() => AlarmEntity, alarm => alarm.faultLogs)
@JoinColumn({ name: 'alarmId' })
alarm: AlarmEntity。
}
存盤庫配置:
export const alarmsProviders = [
{
provide: "AlarmEntity"。
useFactory: (connection: Connection) => connection.getRepository(AlarmEntity) 。
inject: [Constants.DATABASE_CONNECTION]
},
{
provide: "FaultLogEntity"/span>,
useFactory: (connection: Connection) => connection.getRepository(FaultLogEntity)。
inject: [Constants.DATABASE_CONNECTION]
},
資料庫連接:
export const databaseProviders = [
{
provide: Constants.DATABASE_CONNECTION。
useFactory。async () => await createConnection({
type: 'mysql'。
host: 'localhost'。
port: 3000。
username: 'xxx',
password: 'xxx',
資料庫。'alarms',
synchronize: false,
logging: true,
entities: [
__dirname '/../**/*.entity{.ts,.js}',
],
}),
},
];
在應用程式模塊中的使用:
@Module({
controllers: [AppController, AlarmsController] 。
providers: [AppService, AlarmsService, ... databaseProviders, ... alarmsProviders]
})
export class AppModule {
}
所以,主要的問題是:TypeORM需要什么來自動推斷連接條件?我在這里錯過了什么?
uj5u.com熱心網友回復:
其中一個物體應該有一個ManyToOne的關系,你應該嘗試將FaultLogEntity中的關系改為ManyToOne
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/306809.html
標籤:
