Оператор SQL работает в инструменте, но не в Java с использованием JDBC

Я использую приведенный ниже SQL-запрос для извлечения некоторых данных из базы данных. Я использую СУБД H2, нативную реализацию Java. Несмотря на то, что я могу получить указанные данные с помощью инструмента H2, он дает мне следующую ошибку, когда я использую его как PreparedStatement в JAVA:

"; expected ")"; SQL statement: ...

SELECT * FROM (
   SELECT temp.*, ROW_NUMBER() OVER (PARTITION BY horseid ORDER BY updated desc) as num
   FROM(
   select horseid, name, breed, min_speed, max_speed, updated from horsehistory
   UNION
   select id, name, breed, min_speed, max_speed, updated from horse
   ) as temp
   WHERE updated<? AND horseid in ?
)
WHERE num = 1;

Я пробовал использовать новые строки, stringbuilder с разделителем строк безрезультатно.

StringBuilder sb= new StringBuilder();
    appendString(sb, "SELECT * FROM (");
    appendString(sb, "SELECT temp.*, ROW_NUMBER() OVER (PARTITION BY horseid ORDER BY updated desc) AS num");
    appendString(sb, "FROM(");
    appendString(sb, "SELECT horseid, name, breed, min_speed, max_speed, updated FROM horsehistory");
    appendString(sb, "UNION");
    appendString(sb, "SELECT id, name, breed, min_speed, max_speed, updated FROM horse");
    appendString(sb, ") AS temp");
    appendString(sb, "WHERE updated < ? AND horseid IN ?");
    appendString(sb, ")");
    appendString(sb, "WHERE num = 1;");
    String sql=sb.toString();

Функция appendString просто добавляет новую строку к строке. Я использую это в подготовленном заявлении

Что я делаю неправильно?

Обновлено: Это полная ошибка, о которой идет речь

Syntax error in SQL statement "SELECT * FROM ( SELECT TEMP.*, ROW_NUMBER() OVER (PARTITION[*] BY        HORSEID ORDER BY UPDATED DESC) AS NUM FROM ( SELECT HORSEID, NAME, BREED, MIN_SPEED, MAX_SPEED, UPDATED FROM HORSEHISTORY UNION SELECT ID, NAME, BREED, MIN_SPEED, MAX_SPEED, UPDATED FROM HORSE ) AS TEMP WHERE UPDATED < ? AND HORSEID IN (?) ) WHERE NUM = 1  "; expected ")";

После PARTITION стоит [*]. Значит ли это, что ошибка происходит там?

Что произойдет, если вы просто удалите ; в конце?

Lino 18.03.2019 13:57

Когда вы добавляете, вы исключаете пробелы. например. ... AS num"); appendString(sb, "FROM("); становится "AS numFROM("

xtratic 18.03.2019 13:59

@ Лино та же ошибка ...

Minimax 18.03.2019 14:00

@xtratic об этом позаботится функция appendString: private void appendString(StringBuilder sb, String val){ sb.append(val + System.lineSeparator()); }

Minimax 18.03.2019 14:01

Распечатайте свою строку sql и просмотрите.

PM 77-1 18.03.2019 14:01

Какие значения вы указываете для заполнителей ??

Arnaud 18.03.2019 14:03

@Arnaud TimeStamp и массив

Minimax 18.03.2019 14:04

почему вы не используете переменную String здесь

Onkar Musale 18.03.2019 14:04

sout ваш запрос и запустить его против вашей базы данных

Onkar Musale 18.03.2019 14:05

Похоже, вы воспользовались советом Линоса, я удивлен, что на самом деле это было не так. Теперь попробуйте полностью удалить новые строки и посмотреть, исправит ли это что-нибудь. используйте sb.append(val).append(" "); вместо sb.append(val + System.lineSeparator());

xtratic 18.03.2019 14:16

Я попробовал это так, а также просто скопировав sql-запрос из инструмента в строку, та же ошибка. Похоже, ошибка где-то рядом с PARTITION.

Minimax 18.03.2019 14:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
11
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ах, вы используете H2, спасибо за добавление этого флага. H2 похоже не поддерживает PARTITION. Посмотреть здесь

это странно, потому что кажется, что в консоли h2 это работает нормально: i.imgur.com/ct0esPM.png Знаете ли вы, почему это работает здесь?

Minimax 18.03.2019 14:32

@Minimax без понятия

xtratic 18.03.2019 15:59

Вы должны заключить параметр массива ? в круглые скобки:

... horseid IN (?) ...

Другие вопросы по теме