SQLJ IN语句支持

时间:2013-12-26 12:52:13

标签: java sql sqlj

是否可以使用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查询知道我可以拥有可变数量的“汽车品牌”吗?

1 个答案:

答案 0 :(得分:2)

鉴于直接使用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。当然,有other ways to embed SQL in Java,如果SQLJ不是必须的.​​.....