Поддержка SQLJ IN-операторов
Можно ли использовать оператор SQL IN с использованием SQLJ?
Я пытался использовать оператор IN в сочетании с List<String>
или же String[]
представлять коллекцию переменных, но SQLJ говорит, что не может проанализировать объект.
Тип объекта параметра недопустим для запрошенного преобразования.
Это мой запрос в родном SQL:
SELECT *
FROM CARS_TBL
WHERE CAR_BRAND IN ('AUDI', 'PEUGEOT');
В среде Hibernate я бы использовал следующий запрос для достижения результата:
List<String> brandList = new ArrayList<String>();
String hql = "SELECT car FROM Car car WHERE car.carBrand IN (:brandList);"
Тем не менее, я должен использовать SQLJ, и в документации Oracle SQLJ, похоже, нет поддержки типов для массивов или коллекций для использования таким образом.
Ошибка SQLJ возникает в следующей части сгенерированного кода:
__sJT_stmt.setObject(2, brandList);
Он пытается установить коллекцию / массив как объект, но, поскольку нет поддержки List / array, выдается исключение.
Знаете ли вы, как я мог добиться того же результата, что и нативный и спящий запросы, используя SQLJ, зная, что у меня может быть переменное количество "марок автомобилей"?
1 ответ
Учитывая, что это не может быть сделано с помощью JDBC напрямую, и учитывая, что Oracle SQLJ изначально не поддерживает TABLE
или же VARRAY
типы, вы можете добиться успеха, обманув ojdbc, приняв следующее:
String[] brandList = ...
ArrayDescriptor d =
ArrayDescriptor.createDescriptor("ORA_MINING_VARCHAR2_NT", con);
ARRAY array = new ARRAY(d, con, brandList);
#sql {
SELECT * FROM car WHERE car.carBrand IN (
SELECT COLUMN_VALUE FROM TABLE(:array)
);"
}
куда ORA_MINING_VARCHAR2_NT
тип таблицы, который может присутствовать в вашей установке Oracle. Очевидно, вы можете заменить его на что-то более подходящее.
Смотрите также: передать массив в процедуру оракула. Конечно, есть другие способы встраивания SQL в Java, если SQLJ не является обязательным...