WHERE 子句问题

WHERE clause issue

给定以下 SQL 我要构造的语句:

SELECT CONCAT(employees.first_name," ", employees.last_name), landlines.number
FROM employees,landlines WHERE employees.id=landlines.emp_id ORDER BY employees.last_name

最初它是用问号参数创建的,如下所示:

SELECT CONCAT(employees.first_name," ", employees.last_name), landlines.number
FROM employees,landlines WHERE employees.id=? ORDER BY employees.last_name

正如您从 WHERE 条件中看到的那样,我引用了员工 table 的字段和固定电话 table 的字段。基本上是引用外键字段的主键字段。相当标准的东西。

我的问题是使用 PreparedStatement class。我有一个使用如下所示的开关盒的方法:

PreparedStatement statement = ...;
...
//wc is a WhereCondition object and getValue() returns an Object which I cast to a particular type
Field.Type value = wc.getKey().getFieldType();
switch (value)
{
  case STRING:
      statement.setString(index, ((String)wc.getValue()));
      index++;
      break;
  case INT:
      if(wc.getValue() instanceof Field)
      {
        Field fld = (Field)wc.getValue();
        statement.setString(index,fld.toString());
      }
      else
        statement.setInt(index, ((Integer)wc.getValue()));
      index++;
      break;
  case FLOAT:
      statement.setFloat(index, ((Float)wc.getValue()));
      index++;
      break;
  case DOUBLE:
      statement.setDouble(index, ((Double)wc.getValue()));
      index++;
      break;
  case LONG:
      statement.setLong(index, ((Long)wc.getValue()));
      index++;
      break;
  case BIGDECIMAL:
      statement.setBigDecimal(index, ((BigDecimal)wc.getValue()));
      index++;
      break;
  case BOOLEAN:
      statement.setBoolean(index, ((Boolean)wc.getValue()));
      index++;
      break;
  case DATE:
      //We don't want to use the setDate(...) method as it expects
      //a java.sql.Date returned which doesn't allow for any time stamp.
      //Let the database perform the conversion from String to Date type.
      statement.setString(index, ((String)wc.getValue()));
      index++;
      break;
  case DBFUNCTION:
      statement.setString(index, ((String)wc.getValue()));
      index++;
      break;
  case IMAGE:
      statement.setString(index, ((String)wc.getValue()));
      index++;
      break;
}

如果你看一下 INT 案例,我试图通过测试类型 Field 并因此调用 statement.setString(index,fld.toString() 来避免 ClassCastException。问题是我风使用带有 WHERE 子句的 SQL 语句,如下所示:

WHERE employees.id = 'landlines.emp_id'

那些讨厌的引号会阻止查询正常执行。有没有办法设置 INT 类型字段 employees.id 的参数 XXXX,这样就可以在不添加引号的情况下输入 landlines.emp_id?

这将 JOIN 与参数分开。我无法在您的环境中对其进行测试,所以我不确定它是否正确,但它不需要引号:

SELECT CONCAT(e.first_name," ", e.last_name), l.number
FROM employees e
JOIN landlines l ON e.id=l.emp_id
WHERE e.id=? ORDER BY e.last_name