35

执行休眠 sql 查询时出现错误。

java.sql.SQLException: ORA-00904: "table_name"."column_name": 标识符无效

当我在 sqldeveloper 中打开表时,该列存在。

该错误仅发生在 PROD 中,而不发生在 DEV 中。

我应该检查什么?

4

14 回答 14

30

ORA-00904-invalid identifier错误通常是由区分大小写的问题引起的。通常,Oracle 表和列不区分大小写,并且不能包含标点符号和空格。但是,如果您使用双引号来创建带引号的标识符,则必须始终使用双引号和正确的大小写来引用该标识符。例如:

create table bad_design("goodLuckSelectingThisColumn  " number);
于 2011-04-20T03:15:09.237 回答
9

ORA-00904如果执行用户对查询中涉及的对象没有适当的权限,Oracle 将抛出异常。

于 2011-04-19T23:13:12.777 回答
6

当我不小心用相同的持久数据库表定义了两个实体时,这发生在我身上。在其中一个表中,有问题的列确实存在,而在另一个表中不存在。当试图持久化一个对象(引用错误的基础数据库表的类型)时,发生了这个错误。

于 2016-11-04T13:09:07.027 回答
5

将列名写在双引号之间,如“columnName”。

如果错误消息显示的字符大小写与您编写的不同,则很可能您的 sql 客户端为您执行了自动大小写转换。使用双引号绕过它。(这适用于 Squirrell Client 3.0)。

于 2014-03-03T19:59:28.897 回答
4

这是因为创建该列的 DB 之一是使用 " 使其名称区分大小写。

Oracle 表列名称:GoodRec Hive 无法识别区分大小写:引发的错误是 - 原因:java.sql.SQLSyntaxErrorException:ORA-00904:“GOODREC”:标识符无效

解决方案:将 Oracle 列名重命名为全部大写。

于 2017-07-11T11:39:30.267 回答
3

检查字段的 java 类中 Column 注释的位置 例如,考虑一个名称为 STUDENT 的表,其中包含 3 列(名称,Roll_No,Marks)。

然后确保您在 Getter 方法而不是 Setter 方法之前添加了下面的列注释。它将解决您的问题 @Column(name = "Name", length = 100)

**@Column(name = "NAME", length = 100)
public String getName() {**
    return name;
}

    public void setName(String name) {
    this.name= name;
}
于 2017-03-16T09:31:13.290 回答
2

您是否比较过 Prod 和 Dev 中的表定义?

当您在 SQL Developer 中运行它时,您是否在 Prod(与应用程序相同的数据库)中使用相同的用户运行查询?

如果您正在添加一些额外的列(使用 alter 命令)并且这些更改尚未升级为 prod,则可能会出现此问题。

您可以发布表的定义和您的实际查询吗?

于 2011-04-19T21:24:08.017 回答
1

似乎Oracle在很多情况下都会抛出这个错误。

对我来说,它被抛出了,因为我试图限定using在连接部分的子句中使用的列。有两个都不行:

select table1.x -- doesn't work
from table1
join table2 using (x);

select t1.x -- doesn't work
from table1 t1
join table2 t2 using(x);

这是因为我们可以using不使用表名或别名来限定来自子句的列。正确的方法是:

select x
from table1
join table2 using (x);

select x
from table1 t1
join table2 t2 using(x);
于 2021-05-04T11:55:53.753 回答
1

我看到这个错误的原因与上面给出的稍有不同:

我使用 liquibase 脚本来修改我已经存在的 (Oracle) 表。一切看起来都很好,但我的代码中的插入失败了。只有当我看到 SQL Developer 的自动完成功能为我提供了包含引号时,我才看到在创建时已将空格附加到列名。

有问题的 liquibase changeSet 行看起来像这样(在 'MY_FIELD' 结束引号之前有一个空格):

<addColumn tableName="MY_TABLE">
    <column name="MY_FIELD " type="tinyint" defaultValueNumeric="3">
        <constraints nullable="false"/>
    </column>
</addColumn>
于 2021-08-19T16:47:49.250 回答
0

我使用 Toad for Oracle,如果该表的所有者不是您登录的用户名,并且您有权读取该表,则您可能仍需要将原始表所有者添加到表名中。

例如,假设表所有者的名称是“OWNER1”,而您以“USER1”的身份登录。此查询可能会给您一个 ORA-00904 错误:

select * from table_name where x='test';

为 table_name 加上表所有者前缀消除了错误并给出了结果:

select * from 
于 2011-06-02T14:13:50.087 回答
0

这是由于实体中定义的列名与表的列名(在 SQL db 中)不匹配

java.sql.SQLException: ORA-00904: "table_name"."column_name": 无效标识符 egjava.sql.SQLException: ORA-00904: "STUDENT"."NAME": 无效标识符

问题可能类似于 Student.java(entity file) 
您仅将列名提到为“NAME”。
但是在 STUDENT 表中,列名可以说是“NMAE”

于 2020-08-14T01:18:07.463 回答
0

检查 Oracle 中的同义词声明。我正在调用如下的 PL/SQL 函数,它给出了 java.sql.SQLSyntaxErrorException: ORA-00904: invalid identifier

select oracle_my_pkg.notify_list_function from dual

在为 oracle_my_pkg 声明公共同义词后,错误消息消失了

于 2021-08-16T08:32:40.673 回答
-1

检查用于登录数据库的用户名凭据。(persistence.xml ??)。问题主要是,用于登录数据库的用户名\密码对对象(本例中的 table_name)不可见。(尝试使用数据源中可用的相同用户名\密码登录到 sql developer)

于 2011-04-19T21:23:37.273 回答
-1

创建一个新表。但不要在 "(双引号) 中给出看起来像唯一解决方案的值

create table bad_design(goodLuckSelectingThisColumn  number);

安装的

create table bad_design("goodLuckSelectingThisColumn  " number);
于 2021-09-28T09:59:13.420 回答