8

当我的列名包含连字符“-”时出现异常

    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)

有人可以帮我解决这个问题吗?

4

3 回答 3

10

object not found错误的原因是 oh-ordnbr 列被定义为区分大小写(这是由于您在其周围加上了双引号)。

您有两种可能的解决方案:

  1. 不要在 SQL 中使用破折号(连字符)。无论如何,这是不好的做法,请改用下划线。
  2. 更新 JPA 注释,如下所示:

      @Column(name = "`OH-ORDNBR`")
      private Integer ohOrdnbr;
    

我强烈建议使用下划线而不是破折号,您永远不知道使用第二种解决方案时不同的 JPA 实现可能会有什么奇怪之处。

于 2015-04-27T21:35:50.360 回答
1

检查您的配置文件是否有正确的提供程序,我通过提供 org.hibernate.ejb.HibernatePersistence 提供程序解决了同样的问题。

于 2016-07-05T14:32:30.150 回答
0

如果 HSQL 脚本是通过 Java 运行的,并且如果任何新的表查询后面跟着 select/alter/update 查询,它总是会抛出“用户缺少特权对象”。实际上,使用 Java 语句执行后的创建查询永远不会提交到数据库中,也不会持久化,我们运行我们的选择/更改/更新,它会导致异常。如果我们逐行运行查询并为每一行提交,我们可以避免这个错误。

于 2016-05-05T08:54:24.787 回答