使用TypeORM编写PostgreSQL简单子查询遇到问题求助
TypeORM 子查询实现已出版书籍作者过滤方案
核心实现逻辑
你需要的「统计用户对应已出版书籍数量大于0」的子查询逻辑,可通过TypeORM QueryBuilder提供的subQuery()API实现,生成的SQL与你给出的原生语句完全等价,不需要额外关联book表,符合你要求的纯子查询实现方案。
可直接复用的代码
替换你现有代码中andWhere回调部分的占位内容即可:
const query = this.userRepository .createQueryBuilder('user') .leftJoin('user.listing', 'listing') .where(a_condition) .andWhere((qb) => { // 构造COUNT统计子查询 const publishedBookCountSubQuery = qb .subQuery() .select('COUNT(*)') .from(Book, 'book') // 替换为你项目中实际的Book实体类 .where('book.authorId = user.id') .andWhere("book.status = 'published'") .getQuery(); // 拼接数量大于0的判断条件 return `${publishedBookCountSubQuery} > 0`; })
生产环境注意事项
- 请将代码中
Book替换为你项目中已注册到TypeORM的书籍实体类名,否则会生成错误的表名 - 该子查询独立执行,不会影响你原有
leftJoin('user.listing', 'listing')的关联逻辑,不会产生多余的表连接 - 建议使用参数绑定方式传入status值,避免硬编码带来的SQL注入风险,替换子查询中status判断行即可:
.andWhere('book.status = :publishedStatus', { publishedStatus: 'published' })
内容的提问来源于stack exchange,提问作者Francisco Barros
相关产品推荐
相关产品推荐

