Java 选择param=?但如果?是空白,则返回该列的任何值

Java 选择param=?但如果?是空白,则返回该列的任何值,java,mysql,servlets,request,prepared-statement,Java,Mysql,Servlets,Request,Prepared Statement,从我的请求中接收一些字符串、整数和日期,如: String city = request.getParameter("city"); 这些值是用户在my web中编写的值。问题是,如果我的用户不想填写一个输入,例如,城市,查询应该考虑城市可以是任何值。由于我将在我的请求.getParameter中得到一个空格(如果用户没有填写输入文本),我试图告诉查询,如果参数是空格,它必须返回任何值。我试过: String getResults = "SELECT id_housing, name, des

从我的请求中接收一些字符串、整数和日期,如:

String city = request.getParameter("city");
这些值是用户在my web中编写的值。问题是,如果我的用户不想填写一个输入,例如,城市,查询应该考虑城市可以是任何值。由于我将在我的
请求.getParameter
中得到一个空格(如果用户没有填写输入文本),我试图告诉查询,如果参数是空格,它必须返回任何值。我试过:

String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE (city = ? OR ? = '')AND init_date <= ? AND end_date >= ? AND (price = ? OR ? = '') AND (guests = ? OR ? = '')"; 

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city);
stmt.setString(2, city);
stmt.setDate(3, new java.sql.Date(initDate.getTime()));
* and so on... *
String getResults=“从住房中选择id\u住房、名称、描述\u短、价格、照片
其中(城市=?或?=“”)和初始日期=?和(价格=?或?=“”)和(客人=?或?=“”);
PreparedStatement stmt=con.prepareStatement(getResults);
stmt.setString(1,城市);
stmt.setString(2,城市);
setDate(3,新的java.sql.Date(initDate.getTime());
*等等*
查询将运行,但不会返回任何内容。如果一个绑定到一个空白的参数,如何指定它可以是任何值


PD:我不希望构建动态WHERE子句,从查询中添加或删除内容。

假设参数为空,那么您将得到一个结果列表。如果您已经准备好了,那么将参数添加到查询中,条件为“不为空”或“为空”。将数据拉到空上是不正确的。考虑其他方式的设计。若有许多空结果,那个么就不能将索引保留在空值上。然后它将触发性能问题。

在代码中,您试图将列名作为参数传递,但这不起作用
只允许为列传递值

我为你的问题提出另一个解决办法

考虑这个简单的陈述:

String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE (city = ? OR 1 = ?)
(1)如果用户输入了一个有效的值,那么您的代码将是:

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city_text);
stmt.setString(2, 0);
PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, "");
stmt.setString(2, 1);
因此,
WHERE
子句如下所示:

WHERE (city = city_text OR 1 = 0)
WHERE (city = '' OR 1 = 1)
由于
1=0
总是
false
,因此剩余部分
city=city\u text
将获取所需的行

(2)如果用户未输入值,则代码为:

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city_text);
stmt.setString(2, 0);
PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, "");
stmt.setString(2, 1);
因此,
WHERE
子句如下所示:

WHERE (city = city_text OR 1 = 0)
WHERE (city = '' OR 1 = 1)
由于
1=1
始终是
true
,因此整个布尔语句
(city=''或1=1)
将是
true
,因为它根本不存在

因此,您必须检查输入或未输入的值,并在任何情况下调整参数以通过


这只是一个可以扩展到更多列的想法。

在where子句中,
(city=?或?=“”)
应该是
(city=?或city=“”)

因此:

从住房中选择id\u住房、名称、描述\u简短、价格、照片
其中(城市=?或城市=“”)
和init_date=?
和(价格=?或价格=“”)
和(来宾=?或来宾=“”)
这相当于:

SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE city in ('', ?)
    AND init_date <= ? AND end_date >= ? 
    AND price in ('', ?)
    AND guests in ('', ?)
从住房中选择id\u住房、名称、描述\u简短、价格、照片
城市在哪里(“”,?)
和init_date=?
和价格单位(“”、)
和客人在('',)

显然,您必须调整适当设置参数值的代码。

如果您能更好地描述问题而不是“它不工作”,这将有助于澄清问题。查询是否正在运行并返回意外结果,或者您是否收到错误,等等?@csalmhof读取我的PD,我说我不希望添加或删除where子句,我不是说参数为null,而是说参数为空space@Uueerdo很抱歉我的意思是查询会运行,但不会返回任何内容。在我看来,您处理得很正确;如果您无意中遗漏了问题的真正根源,可能至少在问题中包含剩余的五个
stmt.set
语句;您还应该检查执行调用。另外,您已经确保相同的查询从MySql Workbench之类的东西返回结果,对吗?