Hibernate和Spring DataJPA无法处理具有特殊字符的Oracle表名?
当我使用Spring datajpa和Hibenate读取Oracle时,我遇到了一个错误,我将描述以下内容:Hibernate和Spring DataJPA无法处理具有特殊字符的Oracle表名?,spring,oracle,hibernate,spring-boot,spring-data-jpa,Spring,Oracle,Hibernate,Spring Boot,Spring Data Jpa,当我使用Spring datajpa和Hibenate读取Oracle时,我遇到了一个错误,我将描述以下内容: Oracle表名包含特殊字符(双引号),因此,我必须使用SELECT*FROM“Graph”,其中“ID”=1 因此,当我使用hibernate编写实体类时,我必须指出它的特殊名称 以下是用于创建“图形”表的ddl: CREATE TABLE "ATLASCOPCO_TOOLSNET"."Graph" ( "ID" NUMBER(19) NOT NULL , "ResultID" NU
SELECT*FROM“Graph”,其中“ID”=1
“图形”
表的ddl:
CREATE TABLE "ATLASCOPCO_TOOLSNET"."Graph" (
"ID" NUMBER(19) NOT NULL ,
"ResultID" NUMBER(19) NOT NULL ,
"GraphTypeID" NUMBER(19) NOT NULL ,
"SampleTime" BINARY_FLOAT NOT NULL ,
"AngleOffset" BINARY_FLOAT NOT NULL ,
"GraphValues" BLOB NOT NULL ,
"AngleFactor" BINARY_DOUBLE NULL ,
"TorqueFactor" BINARY_DOUBLE NULL ,
"StartTime" BINARY_FLOAT NULL ,
"EndTime" BINARY_FLOAT NULL
)
LOGGING
NOCOMPRESS
NOCACHE
当我使用以下常规表名时:
@Entity
@Table(name = "Graph")
@Getter
@Setter
public class Graph {
@Id
@Column(name = "ID\"")
private Long id;
@Column(name = "ResultID")
private Long resultId;
@Column(name = "GraphTypeID")
private Long graphTypeID;
@Column(name = "SampleTime")
private BINARY_FLOAT sampleTime;
@Column(name = "AngleOffset")
private BINARY_FLOAT angleOffset;
@Column(name = "GraphValue")
private byte[] graphValue;
@Column(name = "AngleFactor")
private BINARY_DOUBLE angleFactor;
@Column(name = "TorqueFactor")
private BINARY_DOUBLE torqueFactor;
@Column(name = "StartTime")
private BINARY_FLOAT startTime;
@Column(name = "EndTime")
private BINARY_FLOAT endTime;
}
我收到错误:原因:java.sql.SQLSyntaxErrorException:ORA-00972:标识符太长
当我使用这个时:
@Entity
@Table(name = "\"Graph\"")
@Getter
@Setter
public class Graph {
@Id
@Column(name = "\"ID\"\"")
private Long id;
@Column(name = "\"ResultID\"")
private Long resultId;
@Column(name = "\"GraphTypeID\"")
private Long graphTypeID;
@Column(name = "\"SampleTime\"")
private BINARY_FLOAT sampleTime;
@Column(name = "\"AngleOffset\"")
private BINARY_FLOAT angleOffset;
@Column(name = "\"GraphValue\"")
private byte[] graphValue;
@Column(name = "\"AngleFactor\"")
private BINARY_DOUBLE angleFactor;
@Column(name = "\"TorqueFactor\"")
private BINARY_DOUBLE torqueFactor;
@Column(name = "\"StartTime\"")
private BINARY_FLOAT startTime;
@Column(name = "\"EndTime\"")
private BINARY_FLOAT endTime;
}
我得到了由以下原因引起的
:java.sql.SQLSyntaxErrorException:ORA-00911:无效字符删除列名中的特殊字符\“
,这会导致问题。JPA和Oracle驱动程序将正确处理所有问题
您可以省略“
,ANSI SQL也可以
CREATE TABLE NEW_TABLE (ID NUMBER(19) NOT NULL , NAME VARCHAR2(19) NOT NULL);
假设表中有一列的名称为“id”,如下所示:
然后要使用特殊字符(“),需要添加转义序列,如下所示:
@Column(name="`\"id\"`")
private int id;
结果将是一列,名称为(“id”)。
请查找以下更新的图形POJO类:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table (name="`\"Graph\"`")
@Getter
@Setter
public class Graph {
@Id
@Column (name="`\"ID\"`")
private Long id;
@Column (name="`\"ResultID\"`")
private Long resultId;
@Column(name="`\"GraphTypeID\"`")
private Long graphTypeID;
@Column (name="`\"SampleTime\"`")
private BINARY_FLOAT sampleTime;
@Column (name="`\"AngleOffset\"`")
private BINARY_FLOAT angleOffset;
@Column (name="`\"GraphValue\"`")
private byte[] graphValue;
@Column (name="`\"AngleFactor\"`")
private BINARY_DOUBLE angleFactor;
@Column (name="`\"TorqueFactor\"`")
private BINARY_DOUBLE torqueFactor;
@Column (name="`\"StartTime\"`")
private BINARY_FLOAT startTime;
@Column (name="`\"EndTime\"`")
private BINARY_FLOAT endTime;
}
要从图表表中检索数据,请在Hibernate中使用以下代码:
Query query=session.createSQLQuery("SELECT * FROM `\" Graph \"` WHERE `\"ID\"`=1 ");
希望这对您有所帮助。您的查询等于SELECT*FROM Graph,其中ID=1
请参见