Java 对Oracle阵列列表联接的Hibernate支持
Oracle支持将表连接到Oracle集合类型(嵌套表或VARRAY)的查询语法。可以使用此语义代替SQL中的in(1,2,3)语法,并允许将值数组绑定到查询。这可以使用Oracle的JDBC驱动程序来完成 这种类型的查询称为Pickler获取。它比在列表中使用SQL更具可伸缩性。我的应用程序在集合中可能有约10000个值 我的问题是我不熟悉Hibernate(我们正在使用Hibernate 3.2.5和Spring 2.0.6),不知道如何使用Hibernate实现这种语义。 通常,JDBC实现的工作方式如下: 使用SQL*Plus中的CREATE type在数据库中定义用户定义的类型 创建或替换类型编号\列表\类型作为编号表 在Java中:Java 对Oracle阵列列表联接的Hibernate支持,java,oracle,hibernate,Java,Oracle,Hibernate,Oracle支持将表连接到Oracle集合类型(嵌套表或VARRAY)的查询语法。可以使用此语义代替SQL中的in(1,2,3)语法,并允许将值数组绑定到查询。这可以使用Oracle的JDBC驱动程序来完成 这种类型的查询称为Pickler获取。它比在列表中使用SQL更具可伸缩性。我的应用程序在集合中可能有约10000个值 我的问题是我不熟悉Hibernate(我们正在使用Hibernate 3.2.5和Spring 2.0.6),不知道如何使用Hibernate实现这种语义。 通常,JDBC实
import java.sql.*;
import oracle.sql.ArrayDescriptor;
import oracle.sql.ARRAY;
import oracle.jdbc.*;
/* The oracle collection is described */
ArrayDescriptor oracleCollection =
ArrayDescriptor.createDescriptor("NUMBER_LIST_TYPE",conn);
PreparedStatement stmt = conn.prepareStatement(
" SELECT ename,empno FROM emp "
+" WHERE empno IN ( "
+" SELECT * FROM TABLE( CAST ( ? as NUMBER_LIST_TYPE ) ) "
+" ) "
);
/* define our java array */
int[] javaArray1 = { 7369,7566,7782 };
/* define our oracle array */
ARRAY jdbcArray1 = new ARRAY (oracleCollection, conn, javaArray1);
/* bind that array to our statement bind variable */
stmt.setObject(1,jdbcArray1);
/* execute the query and browse the result */
ResultSet r=stmt.executeQuery();
while(r.next()){
System.out.println(
"\t"+"\t"+r.getString(2)+": "+r.getString(1));
}
现在,我如何使用Hibernate实现类似的东西呢?这是过去项目中纯粹的个人选项,但Oracle、Hibernate和Spring的组合并不稳定。Hibernate的事务视图与Oracle不匹配,当事情失败时,它们往往通过Spring组件向上级联 我做了进一步的研究,如果我们使用当前的Hibernate版本,我可以创建自己的JDBC DAO。我必须实现org.hibernate.jdbc.Work接口,但它是可行的。它将在休眠状态下工作。该方法的一个示例如下:
不过我还是想知道是否有更好的方法。特别是因为3.2.5中没有工作界面,所以这不是答案。我无法选择在项目中使用Hibernate还是Oracle。它是一个包含大量hibernate代码的已建立的代码库。Oracle是公司的标准。我不明白你的答案,Hibernate+Spring+Oracle有什么问题?我们有几十个使用这个堆栈的项目已经有14年多了,没有发生任何错误。我曾参与过一个大型项目,其中Oracle文本索引的大小为GB,Hibernate将与Oracle不同步。我认为问题不在于事务量,而在于Oracles缓存的压力。Spring使问题变得更糟,因为异常会在线程之间传播,有时会删除其他代码。由于许多其他原因,该项目也是一团糟,但低级查询失败是最难处理的问题。不幸的是,这种方法不适用于hibernate。Hibernate prepared语句不支持Oracle扩展。我不太喜欢ORMs,这只是其中一个原因。