Java 为什么oracle表ALL_TAB_列的本机查询因列无效而失败?

Java 为什么oracle表ALL_TAB_列的本机查询因列无效而失败?,java,oracle,spring-boot,hibernate,spring-data-jpa,Java,Oracle,Spring Boot,Hibernate,Spring Data Jpa,为什么在spring boot hibernatecreateNativeQuery中出现此错误?我正在尝试从oracle数据库获取表信息。我把我的查询放在db eaver它成功了,告诉我本地查询的最佳实践是什么,请 Hibernate: SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='BPN_AKTA' 2020-09-25 10:27:53.005 WARN 60208 ---

为什么在spring boot hibernate
createNativeQuery
中出现此错误?我正在尝试从oracle数据库获取表信息。我把我的查询放在db eaver它成功了,告诉我本地查询的最佳实践是什么,请

Hibernate: SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='BPN_AKTA'
2020-09-25 10:27:53.005  WARN 60208 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 17006, SQLState: 99999
2020-09-25 10:27:53.005 ERROR 60208 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Invalid column name
2020-09-25 10:27:53.006 ERROR 60208 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute query] with root cause

java.sql.SQLException: Invalid column name
Query q=em.createNativeQuery(“从TABLE_NAME='PC'、QueryTableAttModel.class所在的所有_选项卡_列中选择表名称、列名称、数据类型”);
List tableColl=q.getResultList();
我的模型

@Entity(name=“所有选项卡列”)
公共类QueryTableAttModel{
公共字符串getTABLE_NAME(){
返回表名;
}
公共void可设置_名称(字符串表_名称){
this.TABLE_NAME=TABLE_NAME;
}
公共字符串getCOLUMN_NAME(){
返回列名称;
}
public void setCOLUMN\u NAME(字符串COLUMN\u NAME){
this.COLUMN\u NAME=COLUMN\u NAME;
}
公共字符串getDATA_TYPE(){
返回数据类型;
}
公共无效设置数据类型(字符串数据类型){
this.DATA\u TYPE=数据类型;
}
私有字符串表名称;
私有字符串列名称;
私有字符串数据类型;
私有字符串id;
@身份证
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
}

问题在于表
所有选项卡列
没有单列主键。您应该使用基于
所有者
表名
列名
列的复合主键

例如,您可以将
@IdClass
用于复合主键映射:

@实体
@表(name=“所有选项卡列”)
@IdClass(QueryTableAttModelPK.class)
公共类QueryTableAttModel
{
私人字符串所有者;
私有字符串表名;
私有字符串列名;
私有字符串数据类型;
公共QueryTableAttModel()
{
}
@身份证
@列(name=“OWNER”)
公共字符串getOwner()
{
归还所有人;
}
公共void集合所有者(字符串所有者)
{
this.owner=所有者;
}
@身份证
@列(name=“TABLE_name”)
公共字符串getTableName()
{
返回表名;
}
public void setTableName(字符串tableName)
{
this.tableName=tableName;
}
@身份证
@列(name=“Column\u name”)
公共字符串getColumnName()
{
返回列名称;
}
public void setColumnName(字符串columnName)
{
this.columnName=columnName;
}
@列(name=“数据类型”)
公共字符串getDataType()
{
返回数据类型;
}
public void setDataType(字符串数据类型)
{
this.dataType=数据类型;
}
}
其中
querytablettmodelpk
类是

import java.io.Serializable;
导入java.util.Objects;
公共类QueryTableAttModelPK实现可序列化
{
私人字符串所有者;
私有字符串表名;
私有字符串列名;
公共查询表attmodelpk()
{
}
公共QueryTableAttModelPK(字符串所有者、字符串表名、字符串列名)
{
this.owner=所有者;
this.tableName=tableName;
this.columnName=columnName;
}
公共字符串getOwner()
{
归还所有人;
}
公共void集合所有者(字符串所有者)
{
this.owner=所有者;
}
公共字符串getTableName()
{
返回表名;
}
public void setTableName(字符串tableName)
{
this.tableName=tableName;
}
公共字符串getColumnName()
{
返回列名称;
}
public void setColumnName(字符串columnName)
{
this.columnName=columnName;
}
@凌驾
公共布尔等于(对象obj){
如果(this==obj)返回true;
if(obj==null)返回false;
如果(getClass()!=obj.getClass())返回false;
QueryTableAttModelPK其他=(QueryTableAttModelPK)对象;
返回Objects.equals(owner,other.owner)
&&Objects.equals(tableName,other.tableName)
&&Objects.equals(columnName,other.columnName);
}
@凌驾
公共int hashCode(){
返回Objects.hash(所有者、表名、列名);
}
}
然后可以使用本机查询:

List results=em.createNativeQuery(
“从TABLE_NAME=:TABLE的所有_选项卡_列中选择所有者、表_名称、列_名称、数据_类型”,
QueryTableAttModel.class)
.setParameter(“表”、“所有选项卡列”)
.getResultList();
jpql/hql查询:

List results=em.createQuery(
“从QueryTableAttModel q中选择q,其中q.tableName=:table”,
QueryTableAttModel.class)
.setParameter(“表”、“所有选项卡列”)
.getResultList();
或按主键查找实体:

querytablettmodel qTable=em.find(
QueryTableAttModel.class,
新的QueryTableAttModelPK(“系统”、“所有选项卡列”、“字符长度”)
);

问题在于表
所有选项卡列
没有单列主键。您应该使用基于
所有者
表名
列名
列的复合主键

例如,您可以将
@IdClass
用于复合主键映射:

@实体
@表(name=“所有选项卡列”)
@IdClass(QueryTableAttModelPK.class)
公共类QueryTableAttModel
{
私人字符串所有者;
私有字符串表名;
私有字符串列名;
私有字符串数据类型;
公共QueryTableAttModel()
{
}
@身份证
@列(name=“OWNER”)
公共字符串getOwner()
{
归还所有人;
}
公共void集合所有者(字符串所有者)
{
this.owner=所有者;
}
@身份证
@列(name=“TABLE_name”)
公共字符串getTableName()
{
返回表名;
}
public void setTableName(字符串tableName)
{
this.tableName=tableName;
}
@身份证
@列(name=“Column\u name”)
公共字符串getColumnName()
{