当我的列名包含连字符"-"时,我收到异常
Entity : this is the entity name.
@Entity
@Table(name = "RequestHeader")
public class RequestHeader implements Serializable {
....
....
@Column(name = "`oh-ordnbr`")
private Integer ohOrdnbr;
架构定义:这是用于创建架构的查询。
CREATE MEMORY TABLE PUB.REQUESTHEADER(
REQUESTID INTEGER,
IMUSERID INTEGER,
REQUESTDATE DATE,
REQUESTTIME INTEGER,
REQUESTSTATUS VARCHAR(19),
REQUESTTYPE VARCHAR(22),
HEADERINSTRUCTIONS VARCHAR(5150),
DATEFORMAT VARCHAR(20),
TIMEFORMAT VARCHAR(20),
LANGUAGEID INTEGER,
"OH-ORDNBR" INTEGER,
"OH-TRCNSTAMP" INTEGER,
ISPICKUPLIST BIT(1),
CONSTRAINT "RQH-1" PRIMARY KEY(REQUESTID)
);
错误如下:
Exception Stack: Error message which I have received by running the Junit.
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: THIS_.oh-ordnbr
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.ExpressionColumn.checkColumnsResolved(Unknown Source)
at org.hsqldb.QueryExpression.resolve(Unknown Source)
at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
有人可以帮助我解决这个问题吗?
对象错误的原因是 oh-ordnbr 列被定义为区分大小写(这是由于您在它周围加上了双引号)。
您有两种可能的解决方案:
- 不要在 SQL 中使用短划线(连字符)。无论如何,这是不好的做法,请改用下划线。
更新 JPA 注释,如下所示:
@Column(name = "`OH-ORDNBR`") private Integer ohOrdnbr;
我强烈建议使用下划线而不是破折号,您永远不知道使用第二种解决方案时不同的 JPA 实现可能会有什么奇怪之处。
检查您的配置文件是否有正确的提供程序,我通过提供 org.hibernate.ejb.HibernatePersistence 提供程序修复了相同的问题。
如果 HSQL 脚本通过 Java 运行,并且任何新的表查询后跟选择/更改/更新查询,则始终抛出"用户缺少权限对象"。实际上,使用 Java 语句执行后的创建查询永远不会提交到数据库中,并且它不会被持久化,我们运行选择/更改/更新并导致异常。如果我们逐行运行查询并针对每一行提交,则可以避免此错误。