Java 如何在HSQL JRT函数中使用间隔类型?
我正在尝试创建一个JRT函数,该函数接受Java 如何在HSQL JRT函数中使用间隔类型?,java,sql,hsqldb,Java,Sql,Hsqldb,我正在尝试创建一个JRT函数,该函数接受INTERVAL类型的参数。 我的查询可以提供任何类型的间隔,但如果可能,我更喜欢使用间隔日类型 根据,我的函数应该如下所示: public静态字符串exampleHsqlFunction(final java.time.Period duration){ return“在示例函数arg中:”+duration.toString(); } 然后,需要注册该函数。文档中的表中没有指定间隔日类型,因此我将使用间隔月: 创建函数示例\u函数(持续时间间隔月)
INTERVAL
类型的参数。
我的查询可以提供任何类型的间隔
,但如果可能,我更喜欢使用间隔日
类型
根据,我的函数应该如下所示:
public静态字符串exampleHsqlFunction(final java.time.Period duration){
return“在示例函数arg中:”+duration.toString();
}
然后,需要注册该函数。文档中的表中没有指定间隔日
类型,因此我将使用间隔月
:
创建函数示例\u函数(持续时间间隔月)
返回字符(100)
JAVA语言没有SQL
外部名称'CLASSPATH:hsqltest.HsqlIntervalFunctionTest.exampleHsqlFunction';
到目前为止,我的函数注册正确,没有显示错误
现在,我将创建一个虚拟表,以便在测试函数时从中选择一些内容:
创建表虚拟(id INT);插入虚拟值(0);
最后,我可以尝试调用函数本身:
从DUMMY中选择示例_函数(间隔'3'个月);
aa我得到一个错误:
java.lang.IllegalArgumentException:参数类型不匹配
我做了一些调试,在java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
中放置了一个断点,结果是HSQL将org.hsqldb.types.IntervalMonthData
作为参数传递给该方法(或org.hsqldb.types.IntervalSecondData
用于间隔秒
类型)
但是,当Java方法的参数类型更改为IntervalMonthData
时,HSQL无法识别它:
org.hsqldb.hsqldb异常:Java执行:未解析的类名、方法名或签名
我还尝试了一些愚蠢的东西,例如将间隔“3”天作为参数传递。然后抛出以下异常:
org.hsqldb.HsqlException:数据异常:间隔字段溢出
如果我们将参数更改为其他类型,例如INT
和相应的Integer
,则该函数可以工作。只有INTERVAL
似乎不稳定
我在版本2.5.0
中使用HSQL(Maven Central的最新版本),最简单的工作示例:
包装hsqltest;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.sql.Statement;
公共最终类HsqlIntervalFunctionTest{
公共静态字符串exampleHsqlFunction(最终java.time.Period持续时间){
return“在示例函数arg中:”+duration.toString();
}
公共静态void main(最终字符串…args)引发SQLException{
试一试(
最终连接=DriverManager.getConnection(
“jdbc:hsqldb:mem:testdb”,
“sa”,
“sa”
);
最终语句=connection.createStatement()
) {
//创建函数并将其链接到Java方法
statement.executeUpdate(
“创建函数示例\u函数(持续时间间隔月)”
+“返回字符(100)”
+“语言JAVA确定性无SQL”
+“外部名称'CLASSPATH:hsqltest.HsqlIntervalFunctionTest.exampleHsqlFunction';”
);
//创建虚拟表,以便我们可以从中进行选择
语句.executeUpdate(“创建表伪(id INT);”;
语句.executeUpdate(“插入到伪值(0);”;
//使用该函数并打印结果
最终结果set result=statement.executeQuery(
“从DUMMY中选择示例_函数(间隔'3'个月)”
);
while(result.next()){
System.out.println(result.getString(1));
}
}
}
}
INTERVAL类型的Java类型映射似乎无效:以下是IntervalType
中的映射,由于某些原因,正确的类型被注释掉了:这些注释被证明是一项功能:在SourceForge中创建了错误通知单: