【问题标题】:Junit HSQLDB - user lacks privilege or object not found - THIS_.oh-ordnbrJunit HSQLDB - 用户缺少权限或找不到对象 - THIS_.oh-ordnbr
【发布时间】:2015-07-06 11:49:51
【问题描述】:

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

    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)

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

【问题讨论】:

  • 你检查过 HSQLDB 的文档吗?我认为双引号中的列名可能区分大小写。你真的需要连字符吗?我会将它们更改为下划线,无论如何这都是 SQL 标准...
  • @RudolphEst 正确。请张贴作为答案。此外 THIS_ 不应用作表名。

标签: hsqldb spring-junit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 2016-12-31
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多