postgresql 将SQL查询转换为TypeORM查询

xfyts7mz  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(151)

我有一个简单的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;

svgewumm

svgewumm1#

const allCategories = await AppDataSource.createQueryBuilder()
    .select('category.id', 'id')
    .addSelect('category.name', 'name')
    .addSelect('category.planned', 'planned')
    .addSelect('category.type', 'type')
    .addSelect((subQuery) => {
      return subQuery
        .select('COALESCE(SUM(transaction.amount), 0)', 'actual')
        .from(Transaction, 'transaction')
        .where('transaction.categoryId = category.id');
    }, 'actual')
    .where('category.user = :userId', { userId: res.locals.user.id })
    .from(Category, 'category')
    .getRawMany();

字符串
修复方法:
1.使用getRawMany()方法而不是getMany()。阅读这里为什么。本质上,后者是在需要特定数据时使用的。
1.使用AppDataSource而不是特定的仓库。我发现当使用特定的仓库时,我会得到相同数据的副本。这是有意义的,因为我的查询必须超出单个实体。
1.我使用addSelect而不是将它们绑定到一个数组中,因为这是向字段添加别名的唯一方法,否则,例如,使用getRawMany(),数据将作为category_id返回。

相关问题