PreparedStatement可以不考虑WHERE子句中的某些条件吗?

时间:2012-04-15 10:24:47

标签: java mysql sql prepared-statement dao

例如,我有一个声明

"SELECT * FROM Reports WHERE StartDate >= ? WHERE EndDate <= ? AND Performer = ?"

但有时网页上的某些输入字段未填写,因此我不必考虑这些条件。即我没有填写新的日期,所以声明必须

"SELECT * FROM Reports WHERE EndDate <= ? AND Performer = ?"

有3种不同的条件。那么,我是否必须编写8种不同的语句和DAO方法来完成任务?真?也许有其他解决方案?

编辑:我使用MySQL /

3 个答案:

答案 0 :(得分:8)

更改SQL以满足空值。因为您没有告诉我们您正在使用哪个数据库,我将使用“vanilla”SQL:

SELECT * 
FROM Reports
WHERE (EndDate <= ? OR ? is null)
AND (Performer = ? OR ? is null)

将参数分别传递两次。

另一种选择是根据参数为null来改变SQL(例如从where子句中省略Performer = ?),但这可能需要大量的代码和测试。我会使用自适应SQL,如果它表现不好,然后尝试更高级的东西。

答案 1 :(得分:0)

你不需要8个不同的陈述。您可以使用if语句构建查询。例如,

String query = "SELECT * FROM Reports where true";
if(startDate != null)
  query = query + " and startDate <= ?";
if(endDate != null)
  query = query + " and endDate <= ?";
if(performer != null)
  query = query + " and performer = ?";

希望它适合你。

答案 2 :(得分:0)

No Prepared语句不能单独排除contions。要构建的查询以避免不必要的条件。

您可以使用以下代码生成SQL:

StringBuilder whereClause = new StringBuilder();
String and = "";

if(EndDate == null || EndDate.length == 0)
{
    whereClause.append(your condition);
    and = " and";
}

if(StartDate == null || StartDate.length == 0)
{
    whereClause.append(and).append(your condition);
    and = " and";
}

if(Performer == null || Performer.length == 0)
{
    whereClause.append(and).append(your condition);
}

并根据您生成的查询,您需要将参数设置为预准备语句。