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

Oracle 为什么即使列存在,我也有ORA-00904?,oracle,oracle10g,ora-00904,Oracle,Oracle10g,Ora 00904,我在执行hibernate sql查询时看到一个错误 java.sql.SQLException:ORA-00904:“表名称”。“列名称”:无效标识符 当我在sqldeveloper中打开表时,该列就出现了 错误只发生在PROD中,而不发生在DEV中 我应该检查什么?检查用于登录数据库的用户名凭据。(persistence.xml??)。主要问题是,用于登录数据库的用户名\密码对对象(本例中为表\名称)不可见。(尝试使用数据源中可用的相同用户名\密码登录sql developer)您是否比较了

我在执行hibernate sql查询时看到一个错误

java.sql.SQLException:ORA-00904:“表名称”。“列名称”:无效标识符

当我在sqldeveloper中打开表时,该列就出现了

错误只发生在PROD中,而不发生在DEV中


我应该检查什么?

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

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

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

如果您正在添加一些附加列(使用alter命令),但这些更改尚未升级到prod,则可能会出现此问题


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

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

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

create table bad_design("goodLuckSelectingThisColumn" number);

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

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

select * from table_name where x='test';
使用表所有者作为表名称的前缀消除了错误,并给出了结果:

select * from 

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


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

当我意外地用相同的持久数据库表定义了两个实体时,我就遇到了这种情况。在其中一个表中,该列确实存在,而在另一个表中则不存在。当试图持久化对象(其类型引用了错误的基础数据库表)时,发生了此错误。

检查java类中列注释在字段中的位置 例如,考虑一个名为3列的学生的表格(名字,RoopyNO,标记)。< /P> 然后确保在Getter方法之前添加了列的注释,而不是Setter方法。它会解决你的问题 @列(name=“name”,length=100)


这是因为创建该列时使用的一个DBs“使其名称区分大小写

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


解决方案:将Oracle列名重命名为all caps。

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

java.sql.SQLException:ORA-00904:“表名称”。“列名称”:无效标识符 e、 g.java.sql.SQLException:ORA-00904:“学生”“名称”:无效标识符

问题可能是这样的 在Student.java(实体文件)中
您提到的列名仅为“名称”。

但在STUDENT表中,列名是,比如说“NMAE”

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

对我来说,它被抛出了,因为我试图使用联接部分中的子句限定
中使用的列。这两个都不起作用:

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);
这是因为我们可以使用既不带表名也不带别名的
子句来限定
中的列。正确的方法是:

select x
from table1
join table2 using (x);

select x
from table1 t1
join table2 t2 using(x);

这不是给了一个找不到的表吗?SQL>从无效的表名中选择colA;从无效的表名中选择colA*第1行的错误:ORA-00942:表或视图不存在没有persistence.xml。Hibernate正在使用Websphere上定义的数据源我不是说表对象不存在。我是说这是一个可见性问题。他不是说他登录到sqldeveloper并发现一切正常…我唯一能想到的是,用户名有差异。(架构)然后检查您的数据源配置。它应该有连接字符串和用户名\密码凭据正确。。。(在jboss的oracle ds.xml中..我不知道abt Websphere。我想说的是,如果存在可见性问题(grants),那么错误将是“表不存在”"相反。OP发布的错误表明他有权访问该表,但缺少列名,或者他对列名使用了错误的别名。我认为更大的问题可能是列没有进入生产环境db@Kaushik..您找到问题的原因了吗?在我的例子中,经过大量调试后,一个列被删除了拼写错误对我来说也是如此,因为@shareef saidI也有同样的问题,这个错误只发生在Prod系统中。
select x
from table1
join table2 using (x);

select x
from table1 t1
join table2 t2 using(x);