我正在尝试使用以下内容执行准备好的语句:
dbaBean.setPrepStmt(dbaBean.getConn().prepareStatement(
"SELECT id, author, title, url, article_text, date_created " +
"FROM articles WHERE " +
"(EXTRACT(YEAR FROM date_created) = ? OR ? is null) " +
"AND (EXTRACT(MONTH FROM date_created) = ? OR ? is null) " +
"AND (EXTRACT(DAY FROM date_created) = ? OR ? is null) AND " +
"(url = ? OR ? is null) " +
"ORDER BY date_created DESC;"));
dbaBean.getPrepStmt().setString(1, year);
dbaBean.getPrepStmt().setString(2, year);
dbaBean.getPrepStmt().setString(3, month);
dbaBean.getPrepStmt().setString(4, month);
dbaBean.getPrepStmt().setString(5, day);
dbaBean.getPrepStmt().setString(6, day);
dbaBean.getPrepStmt().setString(7, URL);
dbaBean.getPrepStmt().setString(8, URL);
System.out.println(dbaBean.getPrepStmt().toString());
dbaBean 是一个提供连接和准备好的语句的对象。它根本不做任何操作。
我已经非常成功地将上述代码用于其他方法,并且完全没有遇到任何问题。现在这个函数似乎在末尾剥离分号,例如这是 System.out 行的输出:
SELECT id, author, title, url, article_text, date_created FROM articles WHERE (EXTRACT(YEAR FROM date_created) = NULL OR NULL is null) AND (EXTRACT(MONTH FROM date_created) = NULL OR NULL is null) AND (EXTRACT(DAY FROM date_created) = NULL OR NULL is null) AND (url = 'someurl' OR 'someurl' is null) ORDER BY date_created desc
注意缺少的分号。
我尝试添加第二个分号,它也被“吃掉”了。
其他更改被很好地传播(例如要选择的另一个字段)。
如果重要的话,这是 postgresql。
编辑:我在乎,因为我在运行此查询时出错,我认为删除分号是潜在的罪魁祸首。下面的答案似乎表明情况并非如此,我需要在别处寻找它。