3

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

我曾尝试将 IN 语句与 a List<String>or结合使用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 文档中,似乎不支持以这种方式使用数组或集合的类型。

SQLJ 错误在生成的代码的以下部分中引发:

__sJT_stmt.setObject(2, brandList);

它尝试将集合/数组设置为对象,但由于不支持列表/数组,因此会引发异常。

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

4

1 回答 1

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_NTOracle 安装中可能存在的表类型在哪里?您显然可以用更合适的东西替换它。

另请参阅:将数组传递给 oracle 过程。当然,如果 SQLJ 不是必须的,还有其他方法可以在 Java 中嵌入 SQL ...

于 2013-12-26T13:15:42.417 回答