我在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/

10-11 22:49
查看更多