是否可以通过SQLJ使用SQL IN语句?

我尝试将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);
它尝试将集合/数组设置为对象,但是由于不支持列表/数组,因此会引发异常。

您知道我可以使用不同数量的“汽车品牌”吗,您知道如何使用SQLJ与本地和休眠查询获得相同的结果吗?

最佳答案

鉴于不能真正直接使用JDBC来完成此操作,并且鉴于Oracle SQLJ本身不支持TABLEVARRAY类型,可以通过诱使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。当然,如果不是必须的SQLJ,还有other ways to embed SQL in Java

07-24 22:25