SQL 语句在工具中有效,但在 Java 中无效,使用 JDBC
SQL statement working in tool but not in Java using JDBC
我正在使用下面的 SQL 查询从数据库中获取一些数据。我使用的 DBMS 是 H2,一个原生的 java 实现。尽管我可以使用 H2 工具检索所述数据,但当我将它用作 JAVA 中的 PreparedStatement
时,它会给我以下错误:
"; 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 函数只是向字符串追加一个换行符。我在 preparedstatement
中使用它
我做错了什么?
编辑:
这是有问题的完整错误
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后有一个[*]。这是否意味着错误发生在那里?
啊,您正在使用 H2
,感谢您添加该标志。 H2
似乎不支持 PARTITION
。 See here
您必须将数组参数 ?
括在括号中:
... horseid IN (?) ...
我正在使用下面的 SQL 查询从数据库中获取一些数据。我使用的 DBMS 是 H2,一个原生的 java 实现。尽管我可以使用 H2 工具检索所述数据,但当我将它用作 JAVA 中的 PreparedStatement
时,它会给我以下错误:
"; 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 函数只是向字符串追加一个换行符。我在 preparedstatement
中使用它我做错了什么?
编辑: 这是有问题的完整错误
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后有一个[*]。这是否意味着错误发生在那里?
啊,您正在使用 H2
,感谢您添加该标志。 H2
似乎不支持 PARTITION
。 See here
您必须将数组参数 ?
括在括号中:
... horseid IN (?) ...