SQL语句在工具中工作,但在Java中不使用JDBC

问题描述 投票:-3回答:2

我正在使用以下SQL查询从数据库中获取一些数据。我正在使用的DBMS是H2,一个本机java实现。即使我可以使用H2工具检索所述数据,当我在JAVA中将其用作PreparedStatement时,它会给我以下错误:

“;期望”)“; 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;

我尝试过使用newlines,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函数只是向String附加一个换行符。我在准备好的陈述中使用它

我究竟做错了什么?

编辑:这是有问题的完整错误

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后有一个[*]。这是否意味着错误发生在那里?

java sql jdbc prepared-statement h2
2个回答
1
投票

啊,你正在使用H2,谢谢你添加那个标志。 H2似乎不支持PARTITIONSee here


2
投票

你必须在括号中包装你的数组参数?

... horseid IN (?) ...
© www.soinside.com 2019 - 2024. All rights reserved.