【问题标题】:SQL statement working in tool but not in Java using JDBCSQL 语句在工具中工作,但在使用 JDBC 的 Java 中不工作
【发布时间】:2019-08-08 20:29:45
【问题描述】:

我正在使用以下 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;

我尝试过使用换行符、带行分隔符的字符串生成器无济于事。

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

【问题讨论】:

  • 在最后删除; 会发生什么?
  • 追加时排除空格。例如。 ... AS num"); appendString(sb, "FROM("); 变为 "AS numFROM("
  • @Lino 同样的错误...
  • @xtratic appendString 函数负责处理它:private void appendString(StringBuilder sb, String val){ sb.append(val + System.lineSeparator()); }
  • 打印您的 sql 字符串并查看。

标签: java sql jdbc prepared-statement h2


【解决方案1】:

啊,您使用的是H2,感谢您添加该标志。 H2 似乎不支持 PARTITIONSee here

【讨论】:

  • 这很奇怪,因为它似乎在 h2 控制台中运行良好:i.imgur.com/ct0esPM.png你知道它在这里运行的原因吗?
  • @Minimax 不知道
【解决方案2】:

您必须将数组参数 ? 括在括号中:

... horseid IN (?) ...

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多