当前位置: 首页 > 知识库问答 >
问题:

赛贝斯ASE到HSQLDB JUnitjava.sql.SQLSyn的错误异常:未找到类型或用户缺乏特权

奚昌胤
2023-03-14

在我继承的一个项目中,有一个准备好的语句,定义为:

<select id="GET_FILE_BY_FILE_ID" parameterType="long" resultType="com.employer.my.File" statementType="PREPARED">
  SELECT  
    file_id fileId,
    file_name name,
    file_type type,
    CASE WHEN file_data_long is null THEN convert (image, file_data_short) ELSE file_data_long END AS fileData
    FROM FILES_TABLE
    WHERE file_id = #{id}
</select>

此SQL语句在运行时使用赛贝斯ASE数据库时工作正常。

但是执行它的JUnit(作为构建的一部分)一直失败

java.sql.SQLSyntaxErrorException: type not found or user lacks privilege: FILE_DATA_SHORT

我将此错误跟踪到 CASE THEN 转换语句:

    CASE WHEN file_data_long is null THEN convert (image, file_data_short) ELSE file_data_long END AS fileData

即下面的预准备语句,不会产生所述错误:

<select id="GET_FILE_BY_FILE_ID" parameterType="long" resultType="com.employer.my.File" statementType="PREPARED">
  SELECT  
    file_id fileId,
    file_name name,
    file_type type,
    file_data_short fileData
    FROM FILES_TABLE
    WHERE file_id = #{id}
</select>

我怀疑这可能与转换有关,我遇到了这个SO答案,它表明要使用非HSQLDB方言运行HSQLDB,必须首先在HSQLDB上启用该语法兼容模式。

在这个SO答案中发现了类似的提示。

有了这个,我已经能够在 hsqldb.org 文档中找到Sybase特定的指令:

"使用SET DATABASESQLSYNTAX MSS TRUE或等效的URL属性sql.syntax_mss=true启用对CONVERT(

好吧,我就是这样做的,在项目的 HSDLDB 属性中添加 sql.syntax_mss=true

HSQLDB(org.hsqldb.jdbc.JDBCDriver.class, org.hsqldb.jdbc.JDBCDataSource.class, "jdbc:hsqldb:mem:mymemdb;sql.syntax_mss=true", new TestMapperHsqlDB(), true)

但这并没有帮助:在运行 JUnit 测试时,我仍然遇到可怕的异常(只有那时。该查询在运行时或从 DBeaver 运行良好)。

知道在尝试为运行时(Sybase / ASE)和JUnit(HSDLDB)工作时,我还能错过什么吗?


共有1个答案

公孙向荣
2023-03-14

回答我自己的问题,为了其他可能被类似遭遇困扰的人的利益:

在尝试语法/方言修饰符(参见OP)之后,我发现了HSQLDB内置函数的列表,其中“image”不是HSQLDB支持的类型,因此转换没有成功的机会。。。

这促使我寻找一种解决方案/解决方法,其中SQL本身会根据运行它的数据库而略有不同:

<select id="GET_FILE_BY_FILE_ID" parameterType="long" resultType="com.employer.my.File" statementType="PREPARED">
  SELECT  
    file_id fileId,
    file_name name,
    file_type type,
    <if test="_databaseId == 'SYBASE'">
      CASE WHEN file_data_long is null THEN convert (image, file_data_short) ELSE file_data_long END AS fileData
    </if>  
    <if test="_databaseId == 'HSQLDB'">
        CASE WHEN FFT.file_data_long is null  THEN FFT.file_data_short  ELSE FFT.file_data_long  END AS fileData
    </if>
    FROM FILES_TABLE FFT
    WHERE file_id = #{id}
</select>

这个-非常管用。

 类似资料:
  • 我有一个Java8、Spring Boot2应用程序,其中JPA实体连接到MS SQL Server数据库。我试图使用HSQLDB(2.3.3)创建集成测试,如果不包括审计信息(创建日期、上次更新等),它可以正常工作。 我知道“类型找不到或用户缺乏特权”错误是一般性的,可能是由各种原因造成的。在本例中,我知道如果不尝试将datetimeoffset列添加到表中,所有内容都将正确运行。 在联机寻找答

  • 在我的项目中,我使用HSQLDB作为数据库。构造了数据库并添加了两个条目。现在我正在尝试用JPA获取这些条目。不幸的是,出现以下异常 错误:用户缺乏特权或未找到对象:BOOK javax.persistence.persistenceException:org.hibernate.exception.sqlgrammareXception:在org.hibernate.jpa.spi.abstra

  • 我的程序是一个会计管理器,我有一个HSQLDB。这是主类,我目前正在对程序进行测试,所以在主函数中是我输入测试代码以将值插入数据库的地方。这是应用程序类。 我已经多次检查该表是否存在。我使用IntelliJ idea,它有一个数据库管理器,当我直接在数据库中运行相同的SQL时,它运行得很好,所以我知道问题不在于SQL代码。

  • 问题内容: 因此,我已经在Google和堆栈中进行搜索,我发现了一堆错误相同的ppl,但是没有一种解决方案似乎可以解决我的问题。 我正在使用什么: Java 8 JavaEE7 TomEE 7.0 M3 JPA 2.0 ORM 1.0 Postgres 我认为问题在于命名查询,也许还有ManyToMany关系。 实体 User.java SystemRole.java XML配置 persiste

  • 全部的 这个标题几乎说明了一切。我在这里查看,但找不到任何有关模式的信息。 有人能帮我照个灯吗? 我知道MS SQL Server使用“schema.name”来引用数据库中的表,但对于Sybase我不确定。 蒂娅! 编辑: 我想我应该更具体一点。 我知道在MS SQL Server中可以修改表所有者,但您仍然可以通过“从sysobjects so、sysusers su、sys.tables t

  • 我正在构建Spring+Hibernate Java应用程序。我想添加一些集成测试,在内存数据库中完成。 所以,我的普通数据库是Postgresql,我使用。sql脚本与flyway插件一起运行来填充它。ID字段设置为BigSerial。我想使用内存数据库,以类似于我的原始数据库,然后尝试用它来测试一些类。我设法配置了preety的很多东西(我希望如此),但是当我运行测试类本身时,我在创建表脚本中