首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写原始PostgreSQL查询以使用来自TypeORM的SelectQueryBuilder

重写原始PostgreSQL查询以使用来自TypeORM的SelectQueryBuilder
EN

Stack Overflow用户
提问于 2021-04-23 11:18:40
回答 1查看 121关注 0票数 0

我编写了这个获取用户is的查询(这是目前的情况,因为我实际上需要从user表以及与user表相关的另一个名为image的表中获得更多字段)。

这个查询的问题在于它返回一个普通的对象,我需要一个实体对象,我的意思是我知道我可以将它反序列化为我需要的任何模型,但问题是我通常会将entity反序列化为一个所需的响应模型。另外,我想避免发出几个请求:一个是通过使用queryBuilder获取用户ids,另一个是通过这些ids获取正确的实体对象。

因此,似乎有一种可能的解决方案是立即重写该查询以使用queryBuilder。

代码语言:javascript
复制
        const matchedUsers = await this.usersRepository.query(
            `
                SELECT id FROM users
                WHERE id IN (
                    SELECT "usersId" FROM locations_available_fighters_users
                    WHERE "locationsId" IN (
                        SELECT "locationsId" FROM locations_available_fighters_users
                        WHERE "usersId" = ${ me.getId() }
                    )
                ) AND is_active IS TRUE
                  AND id != ${ me.getId() }
                  AND weight = '${ me.getWeight() }'
                  AND gender = '${ me.getGender() }'
                  AND role_name = '${ me.getRoleName() }';
            `
        );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-24 16:06:40

如果你想要解决的问题是:

  • 使用单个查询
  • 将返回的数据作为entity对象而不是原始结果获取
  • 使用QueryBuilder避免编写原始查询

我相信你应该调查的是typeorm子查询

对于您在问题中发布的查询,可以使用QueryBuilder尝试如下所示

代码语言:javascript
复制
// Subquery for your inner most subquery,
const locationsQb = connection.getRepository(LocationsAvailableFightersUser)
    .createQueryBuilder("lafu_1")
    .select("lafu_1.locationsId")
    .where("lafu_1.usersId = :usersID", { usersID: me.getId() });

// Subquery for your middle subquery,
const usersQb = connection.getRepository(LocationsAvailableFightersUser)
    .createQueryBuilder("lafu_2")
    .select("lafu_2.usersId")
    .where("lafu_2.locationsId IN (" + locationsQb.getQuery() + ")");

// Query for retrieving `User` entities as you needed,
const matchedUsers = await connection.getRepository(User)
    .createQueryBuilder("user")
    .where("user.id IN (" + usersQb.getQuery() + ")")
    .setParameters(locationsQb.getParameters())
    .getMany();

在这里我以为,

  • LocationsAvailableFightersUserlocations_available_fighters_users表的实体
  • Userusers表的实体

希望这能帮到你。干杯!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67229008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档