Проблемы с H2: запрос работает в консоли H2, а не в тесте jUnit - PullRequest
0 голосов
/ 12 февраля 2020

Я сталкиваюсь с проблемой с База данных H2 , я не могу понять, что это за проблема.

Я работаю над генератором кода из трех букв, который должен вести себя путем увеличения на один из самых высоких существующих кодов (это функция 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 ";

Что-то, что вы видите, я не видел?

Thanx

1 Ответ

1 голос
/ 12 февраля 2020

Похоже, что вы используете последнюю версию H2, когда вы работаете с Консолью H2, и какую-то старую версию (1.4.196 или более старую) в своем приложении.

Такие старые версии не поддерживают производную синтаксис списка столбцов. Вам также необходимо использовать более свежую версию в вашем приложении.

...