我编写了这个获取用户is的查询(这是目前的情况,因为我实际上需要从user表以及与user表相关的另一个名为image的表中获得更多字段)。
这个查询的问题在于它返回一个普通的对象,我需要一个实体对象,我的意思是我知道我可以将它反序列化为我需要的任何模型,但问题是我通常会将entity反序列化为一个所需的响应模型。另外,我想避免发出几个请求:一个是通过使用queryBuilder获取用户ids,另一个是通过这些ids获取正确的实体对象。
因此,似乎有一种可能的解决方案是立即重写该查询以使用queryBuilder。
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() }';
`
);发布于 2021-04-24 16:06:40
如果你想要解决的问题是:
entity对象而不是原始结果获取QueryBuilder避免编写原始查询我相信你应该调查的是typeorm子查询。
对于您在问题中发布的查询,可以使用QueryBuilder尝试如下所示
// 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();在这里我以为,
LocationsAvailableFightersUser是locations_available_fighters_users表的实体User是users表的实体希望这能帮到你。干杯!
https://stackoverflow.com/questions/67229008
复制相似问题