如何使用 java 中的可选子句准备 SQL 查询?

How to prepare an SQL query with optional clauses in java?

我在 java 中遇到了 preparedStatement 对象的一个​​小问题。我有一个带有几个 JTextField(和其他东西)、一个 JTable 和一个按钮的 GUI。 JTable 是使用对我的数据库的 SQL 请求构建的,如下所示:

SELECT date, item, vendor FROM Sells;

我想在用户单击按钮时使用 JTextFields 过滤结果。 假设我们有一个 JTextField 用于日期,另一个用于项目,另一个用于供应商。

如果所有字段都已填写,我可以使用准备好的查询,如下所示:

String query = "SELECT date, item, vendor FROM Sells WHERE date > ? AND item = ? AND vendor = ?";
PreparedStatement prepared = this.connect.prepareStatement(query);
prepared.setString(1, (String)dateField.getText());
prepared.setString(2, (String)itemField.getText());
prepared.setString(3, (String)vendorField.getText());

这(通过一些调整,如 try/catch、变量声明等)效果很好。 我的问题是管理用户仅使用几个字段进行过滤的可能性(例如仅使用日期,或日期和项目而不是供应商)。 目前,我找不到其他方法:

1) 用if语句测试每个字段的内容,然后修改"query"变量。

2) 使用另一个复杂的 if/else 结构来确定过滤哪些变量,以及应该使用哪个 "prepared.set...."。这很棘手,因为有时它是一个字符串,但有时是一个 int 或其他任何东西。当然,确定索引也是一个小问题,因为它不会每天都一样。

我觉得我错过了什么,我不应该将这个奇怪的解决方案与多个 if/else 一起使用。谁能帮我 ?有没有更简单的解决方案,或者只是我必须以艰难的方式去做的情况?

非常感谢!

仅使用您需要的列构建查询语句可能是最有效的方法。但你也可以这样做:

WHERE (date > ? OR ? IS NULL) AND
      (item = ? OR ? IS NULL) AND
      (vendor = ? OR ? IS NULL)

这需要提供每个参数两次,并假定 "empty" 值为 SQL NULL

这是命名参数简化事情的情况:

WHERE (date > :date OR :date IS NULL) AND
      (item = :item OR :item IS NULL) AND
      (vendor = :vendor OR :vendor IS NULL)