TypeORM Oracle Driver:原生查询正常,实体查询无结果
解决TypeORM连接Oracle时实体查询无结果但原生SQL正常的问题
我帮你分析下你遇到的这个问题——原生query能拿到数据,但用findOne或QueryBuilder查不到,日志里SQL和参数都正确,大概率是实体属性与Oracle数据库列的映射不匹配导致的,以下是具体排查方向和解决方案:
1. 检查列名的大小写与映射配置
Oracle默认会把表名、列名存储为大写,而你的原生查询返回结果里的列是U_UUID,但TypeORM生成的SQL里用的是uuid(比如USER_INFO.uuid),这就导致了匹配不上。
你需要在实体类的@Column装饰器里明确指定数据库的实际列名:
import { Entity, Column, PrimaryColumn } from "typeorm"; @Entity({ name: "USER_INFO" }) // 确保表名也和数据库一致(Oracle默认大写) export class USER_INFO { @PrimaryColumn({ name: "U_UUID", type: "number" }) // 这里指定数据库列名U_UUID uuid: number; // 其他属性也需要按这个规则配置,比如: // @Column({ name: "U_NAME" }) // name: string; }
2. 确认主键映射的正确性
使用findOne时直接传ID,需要确保实体的主键被正确标记,并且类型和数据库一致。比如数据库里U_UUID是NUMBER类型,实体里就要用number类型,不能用string,否则会导致参数类型不匹配,即使SQL看起来正确也查不到数据。
3. 调整QueryBuilder的查询语句
如果暂时不想修改实体,也可以在QueryBuilder里直接使用数据库的原生列名(大写):
const users2 = await connection.manager.createQueryBuilder() .select("u.U_UUID") .from(USER_INFO, "u") .where("u.U_UUID = :uuid", { uuid: 80193220 }) .getMany();
不过更推荐的还是统一实体的映射配置,这样后续查询都会更顺畅。
4. 排查Oracle Driver的配置
检查你的TypeORM连接配置,确保Oracle Driver的相关参数正确,比如是否开启了autoQuote(如果你的表名/列名有特殊字符或大小写敏感的话),不过Oracle默认不需要,主要还是映射问题。
你可以先尝试修改实体的列名映射,应该就能解决这个问题了。
内容的提问来源于stack exchange,提问作者ipoppo
相关产品推荐
相关产品推荐

