我在H2数据库中遇到问题,无法弄清楚这是什么问题。
我正在使用3个字母数字的代码生成器,该代码生成器的行为应该是将现有的最高代码增加一个(这是将存储在DB服务器上的SQL函数)。
以下代码可在H2控制台中完美运行:
SELECT TOP 1 concat(a.Chr, b.Chr, c.Chr) AS REF
FROM
(VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')) a(Chr)
CROSS JOIN
(VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')) b(Chr)
CROSS JOIN
(VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')) c(Chr)
WHERE concat(a.Chr,b.Chr,c.Chr) > (
SELECT TOP 1
CASE
WHEN INSTRUCTION_CODE IS NULL
THEN ''
ELSE INSTRUCTION_CODE
END
FROM ACCOUNT
ORDER BY INSTRUCTION_CODE DESC
)
ORDER BY REF;
我需要在Java jUnit测试中实现此请求。这是我所做的:
public static ResultSet getReference(java.sql.Connection con) throws SQLException {
String query = "SELECT TOP 1 concat(a.Chr, b.Chr, c.Chr) AS REF "
+ "FROM "
+ "(VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')) a(Chr) "
+ "CROSS JOIN "
+ "(VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')) b(Chr) "
+ "CROSS JOIN "
+ "(VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')) c(Chr) "
+ "WHERE concat(a.Chr, b.Chr, c.Chr) > "
+ "(SELECT TOP 1 "
+ " CASE WHEN INSTRUCTION_CODE IS NULL "
+ " THEN '' "
+ " ELSE INSTRUCTION_CODE "
+ " END "
+ "FROM ACCOUNT order by INSTRUCTION_CODE DESC) "
+ "ORDER BY REF";
java.sql.ResultSet rs = con.createStatement().executeQuery(query);
return rs;
}
这是播放时收到的错误消息:
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT TOP 1 CONCAT(A.CHR, B.CHR, C.CHR) AS REF FROM (VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z'))A([*]CHR) CROSS JOIN (VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z'))B(CHR) CROSS JOIN (VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z'))C(CHR) WHERE CONCAT(A.CHR, B.CHR, C.CHR) > (SELECT TOP 1 CASE WHEN INSTRUCTION_CODE IS NULL THEN '' ELSE INSTRUCTION_CODE END FROM ACCOUNT ORDER BY ACBS_PAYMENT_INSTRUCTION_CODE DESC) ORDER BY REF ";
你有没有看到我没有的东西?
谢谢
最佳答案
当您使用H2 Console时,您似乎使用的是H2的最新版本,而您的应用程序中则使用了某些旧版本(1.4.196或更旧的版本)。
此类旧版本不支持派生的列列表语法。您还需要在应用程序中使用更新的版本。
关于java - H2问题:请求可在H2控制台中运行,而不是在jUnit测试中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60186602/