Оператор SQL работает в инструменте, но не в Java, используя JDBC - PullRequest
0 голосов
/ 18 марта 2019

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

"; ожидается") "; оператор SQL: ...

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 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 просто добавляет новую строку в строку. Я использую это в подготовленном заявлении

Что я делаю не так?

EDIT: Это полная ошибка в вопросе

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 ")";

Существует [*] после РАЗДЕЛА. Значит ли это, что там происходит ошибка?

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

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

... horseid IN (?) ...
1 голос
/ 18 марта 2019

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

...