H2 问题:请求在 H2 控制台中有效,在 jUnit 测试中无效

H2 issues : request works in H2 console, not in jUnit test

我遇到 H2 数据库的问题,我无法弄清楚这个问题是什么。

我正在开发一个 3 字母数字代码生成器,它应该通过将现有最高代码递增一个来运行(这是一个将存储在数据库服务器上的 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 控制台时使用的是最新版本的 H2,而在您的应用程序中使用了一些旧版本(1.4.196 或更早版本)。

这些旧版本不支持派生列列表语法。您也需要在您的应用程序中使用更新的版本。