是否可以使用SQLJ语句使用SQL IN语句?
我尝试将IN语句与List<String>
或String[]
结合使用来表示变量集合,但SQLJ表示无法解析该对象。
参数对象类型对于请求的转换无效。
这是我在Native 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文档中,似乎没有Type支持以这种方式使用Arrays或Collections。
生成的代码的以下部分抛出了SQLJ错误:
__sJT_stmt.setObject(2, brandList);
它尝试将集合/数组设置为对象,但由于不支持List /数组,因此抛出异常。
你知道我怎样才能达到和原生相同的效果。使用SQLJ的hibernate查询知道我可以拥有可变数量的“汽车品牌”吗?
答案 0 :(得分:2)
鉴于直接使用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
is a table type that is likely to be present on your Oracle installation。显然,您可以用更合适的东西替换它。
另见:pass array to oracle procedure。当然,有other ways to embed SQL in Java,如果SQLJ不是必须的......