如何将指定SQL查询语句转换为TypeORM Query Builder代码
TypeORM Query Builder 转换代码
首先确认你已正确定义GameType、Draw两个实体,对应字段映射无误,以下是兼容TypeORM 0.2.x版本的写法:
import { getRepository } from 'typeorm'; // 替换为你项目中对应的实体路径 import { GameType } from './entities/GameType'; import { Draw } from './entities/Draw'; // 构造子查询对应SQL里的内层查询 const minDrawDateSubQuery = getRepository(Draw) .createQueryBuilder('draw') .select('draw.GameTypeID', 'GameID') .addSelect('MIN(draw.DrawDate)', 'DrawDate') .where('draw.DrawDate >= GETDATE()') .groupBy('draw.GameTypeID'); // 主查询关联子查询得到最终结果 const queryResult = await getRepository(GameType) .createQueryBuilder('gameType') .innerJoin( `(${minDrawDateSubQuery.getQuery()})`, 'New', 'New.GameID = gameType.GameTypeID' ) // 必须传入子查询的参数,避免参数占位符匹配错误 .setParameters(minDrawDateSubQuery.getParameters()) .getRawMany();
如果你使用的是TypeORM 0.3.x及以上版本,getRepository已废弃,可改用DataSource实例实现:
import { DataSource } from 'typeorm'; import { GameType } from './entities/GameType'; import { Draw } from './entities/Draw'; // 假设你已经初始化过DataSource实例 const dataSource = new DataSource(/* 你的数据库配置 */); const minDrawDateSubQuery = dataSource .getRepository(Draw) .createQueryBuilder('draw') .select('draw.GameTypeID', 'GameID') .addSelect('MIN(draw.DrawDate)', 'DrawDate') .where('draw.DrawDate >= GETDATE()') .groupBy('draw.GameTypeID'); const queryResult = await dataSource .getRepository(GameType) .createQueryBuilder('gameType') .innerJoin( `(${minDrawDateSubQuery.getQuery()})`, 'New', 'New.GameID = gameType.GameTypeID' ) .setParameters(minDrawDateSubQuery.getParameters()) .getRawMany();
补充说明
- 原SQL中的
GETDATE()是SQL Server的当前时间函数,如果你使用其他数据库可按需替换:- MySQL:替换为
CURDATE()或NOW() - PostgreSQL:替换为
CURRENT_DATE或NOW()
- MySQL:替换为
- 如果你需要返回
GameType实体实例而非原始查询结果,可以在主查询中添加.select('gameType.*')后调用getMany()即可。
内容的提问来源于stack exchange,提问作者Oleh Butsyk
相关产品推荐
相关产品推荐

