gpt4 book ai didi

java - prepareStatement() 似乎正在剥离分号

转载 作者:行者123 更新时间:2023-12-01 07:36:48 27 4
gpt4 key购买 nike

我正在尝试使用以下命令执行准备好的语句:

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。

编辑:我很关心,因为我在运行此查询时遇到错误,并且我认为删除分号是潜在的罪魁祸首。下面的答案似乎表明情况并非如此,我需要在其他地方寻找它。

最佳答案

我花了几分钟浏览 Postgresql JDBC 驱动程序源代码,看起来发生的事情如下:

  • 创建准备好的语句时,驱动程序会进行部分解析,将 SQL 拆分为语句,查找占位符并(我认为)删除所有注释。

  • 解析结果存储在 PreparedStatement 对象中的一系列片段中。

  • 如果您在语句上调用 toString(),该方法将重构 SQL,插入占位符的值,并在每个语句之间添加分号。 ..如果有多个语句。

因此,消失的分号是一个功能,而不是一个错误。 JDBC 规范中没有任何内容要求 toString() 方法应以原始形式或任何形式提供查询。此外,在为 JDBC 编写 SQL 时,通常的做法是使用(至少对于 Postgresql)省略尾随分号。

关于java - prepareStatement() 似乎正在剥离分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10914269/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com