【问题标题】:SQLGrammarException: ORA-00904 ("invalid identifier")SQLGrammarException:ORA-00904(“无效标识符”)
【发布时间】:2013-04-03 01:09:40
【问题描述】:

当我对使用 JPA 和 Spring 的 Java 类运行 JUnit 测试时,我收到了 Oracle 错误 /org.hibernate.exception.SQLGrammarException

ORA-00904: "ALIAS"."COLUMN_NAME": invalid identifier

奇怪的是,JUnit 测试在针对开发数据库运行时有效,但在针对我用于持续集成构建的数据库(它们都是 Oracle 数据库)运行时失败。

因此,这表明后者的 d/b 中有一些缺失或错误。但是,我已经两次(和三次)检查了所引用的表在两个数据库中是否相同,并且包含错​​误所指的列 COLUMN_NAME。

更多信息 - 在 JUnit 测试中调用的 DAO Java 类使用 javax.persistence.EntityManager:

MyClass myObject = entityManager.find(MyClass.class, idNumber);

MyClass JPA 实体类映射到 Oracle 表:

@Configurable
@Entity
@Table(name = "MyTable", schema = "MySchema")
public class MyClass implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
    @SequenceGenerator(name = "MY_SEQ", sequenceName = "MY_SEQ", allocationSize = 1)
    @Column(name = "ID")
    protected BigDecimal id;

    @Column(name = "COLUMN_NAME")
    private String columnName;
    ...
}

两个数据库中的数据库表中的列 COLUMN_NAME 都是 VARCHAR2(50) 并且可以为空。

版本:

Java - 1.6

春季 - 3.1.1

甲骨文 - 11.2.0.3.0

提前感谢您的帮助。

【问题讨论】:

  • 也许它们并不完全相同——也许在其中一个数据库中,该列是使用" 创建的,这使得它的名称区分大小写。见this sqlfiddle demo - 两张表看起来一样,但一张会给出结果,另一张会给出结果ORA-00904
  • 我已经检查了创建表格的脚本,并且可以确认其中任何地方都没有使用引号。我还删除了表格并使用此脚本重新创建了它,所以我知道任何地方的引号都没有问题。
  • 我不熟悉 JPA,但是你能看到生成的查询吗?可以给我们看看吗?
  • 该表在数据库端的外观如何?你能在数据库上执行desc MyTable并发布结果吗?

标签: java oracle spring hibernate jpa


【解决方案1】:

发现问题。我找到了 Hibernate 正在创建的查询(通过添加

<property name="hibernate.show_sql" value="true" />

到我的 data-persistence.xml 文件)并尝试在测试失败的数据库中运行它。可以看出,在实体 Java 类中,关联的数据库表是这样定义的:

@Table(name = "MyTable", schema = "MySchema")

... 这对开发 d/b 效果很好。但是,持续集成数据库的所有表都在称为其他模式的模式中创建,因此会出现错误。

感谢大家的帮助。

【讨论】:

  • 知道如何找到我的表所在的架构吗?
【解决方案2】:

有同样的问题。原因是我错过了添加架构和表名。

@Table(name = "Table", schema = "Schema")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2022-01-22
    • 2011-08-27
    • 2011-04-21
    • 2019-06-29
    相关资源
    最近更新 更多