java.sql.SQLException:尝试检索视图条目时列名无效

Posted

技术标签:

【中文标题】java.sql.SQLException:尝试检索视图条目时列名无效【英文标题】:java.sql.SQLException: Invalid column name when trying to retrieve the entries of a view 【发布时间】:2020-11-24 19:43:56 【问题描述】:

已解决:在 VW_MYVIEW 中添加了新列(用于 id

我创建了一个 view,其中包含一个脚本和一个 java 类,它将包含视图中的所有列。 但是当我尝试从视图中获取结果列表时,我收到:invalid column name exception。 这就是我获取数据的方式:

 Query query = entityManager.createNativeQuery("select * from VW_MYVIEW", MyView.class); 

 List<MyView> list = return query.getResultList();

下面是我的观点和我的 java 类。我的视图中没有 id,所以我添加了:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

因为它抱怨需要一个 id。

VW_MYVIEW

COLUMN_NAME | DATA_TYPE
name        | varchar(45)
text        | varchar(20)
nr          | number


@Entity
@Table(name = "VW_MYVIEW")
public class MyView implements Serializable 

  private static final long UID = 1L;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @Column(name = "name")
  private String name;

  @Column(name = "text")
  private String text;

  @Column(name = "nr")
  private Long nr;
  
  public String getName() 
    return name;
  

  public void setName(String name) 
    this.name = name;
  
  
  public String getText() 
    return text;
  

  public void setText(String text) 
    this.text = text;
  

  public Long getNr() 
    return nr;
  

  public void setNr(Long nr) 
    this.nr = nr;
  

如果您对我为什么会收到该异常有任何想法,请随时发表评论。

例外:

**Caused by: java.sql.SQLException: Invalid column name
at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3757)
at oracle.jdbc.driver.InsensitiveScrollableResultSet.findColumn(InsensitiveScrollableResultSet.java:264)
at oracle.jdbc.driver.GeneratedResultSet.getLong(GeneratedResultSet.java:558)
at com.zaxxer.hikari.pool.HikariProxyResultSet.getLong(HikariProxyResultSet.java)
at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:63)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:333)
at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:794)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:719)**

【问题讨论】:

我在 Internet 上看到的所有代码示例都要求您枚举字段,如 SELECT field1, field2, field3 FROM sometable 我试过了,stii不工作:( 同样的错误? .... 是的。这可能是我在java类中添加的id的问题,但我不确定.. 好的,我认为错误消息的含义正是它所说的。检查 MyView 类中的每个列名;确保它与 SQL 和表中的列名精确对齐。 【参考方案1】:

type 是a reserved word in Oracle。

最好的方法是将此列重命名为非保留字。如果你不能这样做,你需要逃避它。例如:

@Column(name = "\"type\"")
private String type;

【讨论】:

这里只是用来问这个问题的列名(我不使用列'type''),我会修改列名(我没有灵感)。对不起..

以上是关于java.sql.SQLException:尝试检索视图条目时列名无效的主要内容,如果未能解决你的问题,请参考以下文章

我在尝试从其他方法访问此返回的 resultSetCustomer. 时收到错误“java.sql.SQLException:结果集结束后”

: java.sql.SQLException: 尝试使用 Databricks Connect 在 Databricks 集群上运行 Python 脚本时没有合适的驱动程序

插入错误:java.sql.SQLException:ORA-00911:无效字符

java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭

java.sql.SQLException:架构“ROOT”不存在

java.sql.SQLException:无效的列索引