Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在HSQL JRT函数中使用间隔类型?_Java_Sql_Hsqldb - Fatal编程技术网

Java 如何在HSQL JRT函数中使用间隔类型?

Java 如何在HSQL JRT函数中使用间隔类型?,java,sql,hsqldb,Java,Sql,Hsqldb,我正在尝试创建一个JRT函数,该函数接受INTERVAL类型的参数。 我的查询可以提供任何类型的间隔,但如果可能,我更喜欢使用间隔日类型 根据,我的函数应该如下所示: public静态字符串exampleHsqlFunction(final java.time.Period duration){ return“在示例函数arg中:”+duration.toString(); } 然后,需要注册该函数。文档中的表中没有指定间隔日类型,因此我将使用间隔月: 创建函数示例\u函数(持续时间间隔月)

我正在尝试创建一个JRT函数,该函数接受
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中创建了错误通知单: