Учитывая следующий 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 условие Я ссылаюсь на поле из таблицы сотрудников с полем из таблицы наземных линий. В основном поле первичного ключа, ссылающееся на поле внешнего ключа. Довольно стандартный материал.
Моя проблема связана с классом PreparedStatement. У меня есть метод, который использует корпус переключателя, который выглядит следующим образом:
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 я пытался избежать ClassCastException путем тестирования для типа поля и, таким образом, вызывая statement.setString (индекс, . fld.toString() проблема в том, что я наматывать с помощью оператора SQL с ИНЕКЕ, которая выглядит следующим образом:.
WHERE employees.id = 'landlines.emp_id'
Эти противные кавычки предотвратить запрос от выполнения правильно ли способ, чтобы setXXXX параметр для field employee.id, который имеет тип INT, так что landlines.emp_id можно вводить без добавления котировок?
Вы не можете передать идентификатор (имя столбца) в качестве параметра для Предварительно подготовленное. Вам необходимо динамически строить SQL в Java. –
«PreparedStatement» _compiled_ на сервере - поэтому вы должны иметь ** полный ** и ** действительный ** SQL. –
См. Http://stackoverflow.com/questions/3135973/variable-column-names-using-prepared-statements –