HSQLDB ANY 数组函数不起作用
HSQLDB ANY array function not working
我有一个table这样的
CREATE TABLE inlist_test_table (
id NUMERIC(5) NOT NULL PRIMARY KEY,
val VARCHAR(50) NOT NULL
);
我正在执行以下查询
SELECT val
FROM inlist_test_table
WHERE id = ANY(?)
ORDER BY id
使用此代码
try (var connection = this.dataSource.getConnection();
var preparedStatement = connection.prepareStatement(this.getQuery())) {
var array = connection.createArrayOf("smallint", new Object[] {3, 5});
try {
preparedStatement.setArray(1, array);
List<String> values = new ArrayList<>(2);
try (var resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
values.add(resultSet.getString(1));
}
}
assertEquals(Arrays.asList("Value_00003", "Value_00005"), values);
} finally {
array.free();
}
}
我希望返回 ID 为 3 和 5 的行。相反,我收到以下异常:
java.sql.SQLSyntaxErrorException: invalid ORDER BY expression in statement [SELECT val FROM inlist_test_table WHERE id = ANY(?) ORDER BY id]
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at com.github.marschall.jdbcinlists.AbstractInListTest.plainJdbc(AbstractInListTest.java:43)
...
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: org.hsqldb.HsqlException: invalid ORDER BY expression
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.QuerySpecification.resolveColumnReferencesInOrderBy(Unknown Source)
at org.hsqldb.QuerySpecification.resolveColumnReferences(Unknown Source)
at org.hsqldb.QuerySpecification.resolveReferences(Unknown Source)
at org.hsqldb.QueryExpression.resolve(Unknown Source)
at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 59 more
我正在使用 HSQLDB 2.4.1。相同的代码适用于 Postgres 和 H2。
编辑 1
SELECT val
FROM inlist_test_table
WHERE id IN ( UNNEST(?) )
ORDER BY id
不起作用,因为只有 ID 为 3 的行(数组中的第一个元素)匹配,而 ID 为 5 的行(数组中的第二个元素)不匹配。
编辑 2
将列类型从 NUMERIC(5)
更改为 int
会使 UNNEST
代码工作,即使数组元素类型为 smallint
.
对于 HSQLDB,您需要使用
... WHERE id IN ( UNNEST(?) ) ...
从版本 2.4.1 开始,当列为 NUMERIC(5)
且数组为 smallint
时,似乎存在问题。这可能会在 HSQLDB 的未来版本中得到修复。
我有一个table这样的
CREATE TABLE inlist_test_table (
id NUMERIC(5) NOT NULL PRIMARY KEY,
val VARCHAR(50) NOT NULL
);
我正在执行以下查询
SELECT val
FROM inlist_test_table
WHERE id = ANY(?)
ORDER BY id
使用此代码
try (var connection = this.dataSource.getConnection();
var preparedStatement = connection.prepareStatement(this.getQuery())) {
var array = connection.createArrayOf("smallint", new Object[] {3, 5});
try {
preparedStatement.setArray(1, array);
List<String> values = new ArrayList<>(2);
try (var resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
values.add(resultSet.getString(1));
}
}
assertEquals(Arrays.asList("Value_00003", "Value_00005"), values);
} finally {
array.free();
}
}
我希望返回 ID 为 3 和 5 的行。相反,我收到以下异常:
java.sql.SQLSyntaxErrorException: invalid ORDER BY expression in statement [SELECT val FROM inlist_test_table WHERE id = ANY(?) ORDER BY id]
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at com.github.marschall.jdbcinlists.AbstractInListTest.plainJdbc(AbstractInListTest.java:43)
...
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: org.hsqldb.HsqlException: invalid ORDER BY expression
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.QuerySpecification.resolveColumnReferencesInOrderBy(Unknown Source)
at org.hsqldb.QuerySpecification.resolveColumnReferences(Unknown Source)
at org.hsqldb.QuerySpecification.resolveReferences(Unknown Source)
at org.hsqldb.QueryExpression.resolve(Unknown Source)
at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 59 more
我正在使用 HSQLDB 2.4.1。相同的代码适用于 Postgres 和 H2。
编辑 1
SELECT val
FROM inlist_test_table
WHERE id IN ( UNNEST(?) )
ORDER BY id
不起作用,因为只有 ID 为 3 的行(数组中的第一个元素)匹配,而 ID 为 5 的行(数组中的第二个元素)不匹配。
编辑 2
将列类型从 NUMERIC(5)
更改为 int
会使 UNNEST
代码工作,即使数组元素类型为 smallint
.
对于 HSQLDB,您需要使用
... WHERE id IN ( UNNEST(?) ) ...
从版本 2.4.1 开始,当列为 NUMERIC(5)
且数组为 smallint
时,似乎存在问题。这可能会在 HSQLDB 的未来版本中得到修复。