为什么即使列存在,我也有ORA-00904?

时间:2011-04-19 21:17:54

标签: oracle oracle10g ora-00904

执行hibernate sql查询时发现错误。

  

java.sql.SQLException:ORA-00904:“table_name”。“column_name”:无效标识符

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

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

我应该检查什么?

11 个答案:

答案 0 :(得分:23)

这可能是一个区分大小写的问题。通常,表和列不区分大小写,但如果使用引号,则它们将是区分大小写的。例如:

create table bad_design("goodLuckSelectingThisColumn" number);

答案 1 :(得分:6)

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

答案 2 :(得分:6)

当我意外地使用相同的持久性数据库表定义了两个实体时,发生了这种情况。在其中一个表中,有问题的列确实存在,而另一个表中则没有。尝试持久化对象(指向错误的基础数据库表的类型)时,发生此错误。

答案 3 :(得分:4)

将列名写在DOUBLE引号之间,如“columnName”中所示。

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

答案 4 :(得分:3)

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

Oracle表列名:GoodRec Hive无法识别区分大小写:抛出的错误是 - 引起:java.sql.SQLSyntaxErrorException:ORA-00904:" GOODREC":无效标识符

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

答案 5 :(得分:2)

检查字段的java类中的Column注释的位置 例如,考虑一个名为STUDENT且具有3列的表(Name,Roll_No,Marks)。

然后确保在Getter Method 之前添加了列的注释,而不是Setter方法。它会解决你的问题 @Column(名称="名称",长度= 100)

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

    public void setName(String name) {
    this.name= name;
}

答案 6 :(得分:1)

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

当你在SQL Developer中运行它时,你是在Prod(与应用程序相同的数据库)和同一个用户中运行查询吗?

如果您要添加一些其他列(使用alter命令)并且这些更改尚未提升为prod,则可能出现此问题。

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

答案 7 :(得分: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);

答案 8 :(得分:0)

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

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

select * from table_name where x='test';

使用表所有者对table_name进行前缀消除了错误并给出了结果:

select * from 

答案 9 :(得分:0)

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

java.sql.SQLException:ORA-00904:“表名称”。“列名称”:无效的标识符 例如,java.sql.SQLException:ORA-00904:“学生”。“名称”:无效的标识符

问题可以像 在Student.java(实体文件)中
您仅将列名提到为“ NAME”。
但是在STUDENT表中,列名称为“ NMAE”

答案 10 :(得分:-1)

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