我有一个简单的SQL:
SELECT
c.name,
c.planned,
(
SELECT COALESCE(SUM(t.amount), 0)
FROM public.transaction AS t
WHERE t."categoryId" = c.id
) AS actual,
c.type,
c.id,
c."userId"
FROM public.category AS c;
字符串
我试着把它转换成一个TypeORM查询:
const allCategories = await categoryRepository
.createQueryBuilder()
.select([
'category.id',
'category.name',
'category.planned',
'category.type',
])
.addSelect((subQuery) => {
return subQuery
.select('COALESCE(SUM(transaction.amount))', 'category.actual')
.from(Transaction, 'transaction')
.where('transaction.categoryId = category.id');
}, 'category.actual')
.where('category.user = :userId', { userId: res.locals.user.id })
.from(Category, 'category')
.getMany();
型
问题是actual
字段没有返回,我不知道我做错了什么。
这是TypeORM查询的SQL输出:
SELECT
"category"."id" AS "category_id",
"category"."name" AS "category_name",
"category"."planned" AS "category_planned",
"category"."type" AS "category_type",
(
SELECT COALESCE(SUM("transaction"."amount"), 0) AS "category_actual"
FROM "transaction"
WHERE "transaction"."categoryId" = "category"."id"
) AS "category_actual"
FROM
"category"
WHERE
"category"."userId" = $1;
型
1条答案
按热度按时间svgewumm1#
字符串
修复方法:
1.使用
getRawMany()
方法而不是getMany()
。阅读这里为什么。本质上,后者是在需要特定数据时使用的。1.使用
AppDataSource
而不是特定的仓库。我发现当使用特定的仓库时,我会得到相同数据的副本。这是有意义的,因为我的查询必须超出单个实体。1.我使用
addSelect
而不是将它们绑定到一个数组中,因为这是向字段添加别名的唯一方法,否则,例如,使用getRawMany()
,数据将作为category_id
返回。