在我继承的一个项目中,有一个准备好的语句,定义为:
<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)工作时,我还能错过什么吗?
回答我自己的问题,为了其他可能被类似遭遇困扰的人的利益:
在尝试语法/方言修饰符(参见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的很多东西(我希望如此),但是当我运行测试类本身时,我在创建表脚本中