【问题标题】:DB2 + JPA throwing an error: column not found in the tableDB2 + JPA 抛出错误:在表中找不到列
【发布时间】:2015-03-20 17:45:51
【问题描述】:

当 JPA 尝试持久化实体时,DB2-express 抛出了一个看似不可能的错误:

ReportingSQLException: "ITEMID" is not valid in the context where it is used..

INSERT INTO NULLID."DynamicDatabaseTable" ("colname", "rownumber", "value")
VALUES (?, ?, ?) [params=?, ?, ?]

由于上面的查询中没有使用ITEMID,怎么会出现这个错误? ITEMID是一个自动标识生成的列。

我已经尝试手动执行查询,它工作正常,所以有人知道这是怎么回事吗?即使经过大量谷歌搜索,我在这里完全一无所知。


DB2中的数据库表没问题,我有三重检查:

"itemid" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY ( START WITH 1...), 
"rownumber" BIGINT NOT NULL, 
"colname" CHAR(30 OCTETS) NOT NULL, 
"value" VARCHAR(254 OCTETS)

我使用 Eclipse 向导创建了一个简单的 java“表中的 JPA 实体”,并且我已经三次检查该类是否正常。

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="\"itemid\"", unique=true, nullable=false)
private long itemid;

@Column(name="\"rownumber\"", nullable=false)
private long rownumber;

@Column(name="\"colname\"", nullable=false, length=30)
private String colname;

@Column(name="\"value\"", length=254)
private String value;

为了以防万一,我还重新启动了整个计算机,但什么都没有……而且我正在使用最新版本,几周前全新安装。

【问题讨论】:

    标签: db2 jpa-2.0


    【解决方案1】:

    "itemid" 不等于itemid -- SQL 标识符默认转换为大写如果没有用双引号括起来。根据您的 DDL,您使用小写列名创建了表。显然,JPA 没有正确处理该问题,并且在生成的代码中的某处使用了未加引号的itemid,它被转换为大写,毫不奇怪,在表中找不到该列。

    没有理由在 SQL 中使用区分大小写的标识符,因此我建议您不要这样做以避免此类问题。

    【讨论】:

    • 用大写的 ITEMID 重新创建了表,还用 insertable=false 重新创建了实体,效果很好!似乎 ID 字段以某种方式从数据库中救出以填充 java 字段。
    猜你喜欢
    • 2021-07-04
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    相关资源
    最近更新 更多