我有 2 个表 - 订阅和周期。我正在尝试加入我的订阅中的第一期和最后一期。这是我如何添加子查询的部分代码。
export class SubscriptionQueryBuilder {
private readonly qb: SelectQueryBuilder<SubscriptionSchema>;
constructor(
private readonly repository: Repository<SubscriptionSchema>,
) {
this.qb = this.repository.createQueryBuilder('sub');
...
this.addPeriodsQuery();
}
...
private addPeriodsQuery() {
const subquery = `
SELECT "period"."id" AS periods_id,
"period"."subscription_id" AS periods_subscription_id,
"period"."start" AS periods_start,
"period"."end" AS periods_end,
ROW_NUMBER() OVER (PARTITION BY "period"."subscription_id" ORDER BY "period"."start" DESC) AS "start_rank",
ROW_NUMBER() OVER (PARTITION BY "period"."subscription_id" ORDER BY "period"."end" ASC) AS "end_rank"
FROM "subscription_period" "period"
`;
this.qb
.leftJoinAndMapMany(
'sub.periods',
`(${subquery})`,
'periods',
'sub.id = periods.periods_subscription_id',
)
.andWhere('periods.start_rank = 1 OR periods.end_rank = 1');
}
生成的 SQL 查询似乎是正确的,但 typeorms 映射器只是没有将数据映射到属性。
@Entity()
export class SubscriptionSchema {
@PrimaryGeneratedColumn('uuid', {})
id: string;
...
public periods?: SubscriptionPeriodSchema[];
...
有人成功使用
leftJoinAndMapMany
或 leftJoinAndMapOne
进行子查询吗?
最后,我完成了基于
getRawAndEntities
的解决方案。由于某种原因,我错过了这个方法。这并不理想,但存储库模式可以让您手动完成映射。