Поддержка 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 не является обязательным...

Другие вопросы по тегам