2016-01-17 3 views
0

Учитывая следующий 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 можно вводить без добавления котировок?

+1

Вы не можете передать идентификатор (имя столбца) в качестве параметра для Предварительно подготовленное. Вам необходимо динамически строить SQL в Java. –

+0

«PreparedStatement» _compiled_ на сервере - поэтому вы должны иметь ** полный ** и ** действительный ** SQL. –

+0

См. Http://stackoverflow.com/questions/3135973/variable-column-names-using-prepared-statements –

ответ

1

Это отделяет 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 
+0

Да, я думаю, я собираюсь, вероятно, пойти по этому маршруту и ​​изменить синтаксис, как вы предлагаете. Благодарю. – Alan