Spring Boot / JPA:引用的保留字列名称无效

时间:2018-01-05 11:55:52

标签: oracle jpa spring-boot

我有一个Oracle表,其中一列以保留字(TYPE)

命名

这在实体类中定义为

@Entity
@Table(name="PROCESS_STORAGE")
.....
@Column(name="\"TYPE\"")
private String type;

但是尝试从数据库中检索记录会导致错误:

2018-01-05 11:50:54.139  WARN 9340 --- [http-nio-8080-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 904, SQLState: 42000
2018-01-05 11:50:54.139 ERROR 9340 --- [http-nio-8080-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-00904: "PROCESSSTO0_"."type": invalid identifier
2018-01-05 11:50:54.144 ERROR 9340 --- [http-nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause

java.sql.SQLSyntaxErrorException: ORA-00904: "PROCESSSTO0_"."type": invalid identifier

我不太清楚我在这里失踪了什么。它似乎引用了列名,但它找不到它?

修改 我刚刚意识到它是一个区分大小写的问题 - 该列在DB(TYPE)和实体定义中是大写的,但由于某种原因,它在查询中被转换为小写。仍然不确定为什么会发生这种情况

3 个答案:

答案 0 :(得分:3)

想想我找到了解决方案 here

在application.properties中,需要指定

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

答案 1 :(得分:1)

您需要将带有反引号(`)的保留关键字括起来,以便将其用作列

TYPE保留在Oracle中,因此应该

@Column(name="`TYPE`")
private String type;

答案 2 :(得分:0)

如果您使用的是Hibernate 3.5+,请尝试:

hibernate.globally_quoted_identifiers=true引用所有数据库标识符,这是为JPA 2.0添加的。

在JPA 2.0中,语法标准化并变为:

@Column(name="\"TYPE\"")