Sybase ASE到HSQLDB JUnit java.sql.SQLSyntaxErrorException:找不到类型或用户缺少权限

Sybase ASE到HSQLDB JUnit java.sql.SQLSyntaxErrorException:找不到类型或用户缺少权限,java,junit,prepared-statement,hsqldb,sap-ase,Java,Junit,Prepared Statement,Hsqldb,Sap Ase,在我继承的一个项目中,有一个准备好的语句定义为: <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 nu

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

<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>
我将此错误跟踪到CASE-THEN-convert语句:

    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>
但这并没有帮助:在运行JUnit测试时,我仍然会遇到可怕的异常(只有在那时,该查询才能在运行时或从DBeaver中正常运行)


你知道我在运行时(Sybase/ASE)和JUnit(HSDLDB)中还缺少什么吗?

回答我自己的问题,让其他可能因类似遭遇而困惑的人受益:

在尝试语法/方言修饰符(请参见OP)之后,我发现,HSQLDB不支持“image”类型,因此
convert
没有成功的机会

这促使我寻找一种解决方案/解决方案,其中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>

挑选
文件id文件id,
文件名,
文件类型,
如果file_data_long为空,则转换(图像、file_data_short)ELSE file_data_long作为fileData结束
当FFT.file_data_long为空时,则FFT.file_data_short否则FFT.file_data_long结束为fileData
从文件到表格FFT
其中文件_id=#{id}
这就像一个符咒

HSQLDB(org.hsqldb.jdbc.JDBCDriver.class, org.hsqldb.jdbc.JDBCDataSource.class, "jdbc:hsqldb:mem:mymemdb;sql.syntax_mss=true", new TestMapperHsqlDB(), true)
<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>