You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:21