Java 对Oracle阵列列表联接的Hibernate支持

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实

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中:

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,这只是其中一个原因。