Hibernate支持Oracle Array列表连接

时间:2010-10-20 13:47:04

标签: java oracle hibernate

Oracle支持查询语法,其中表连接到Oracle集合类型(嵌套表或VARRAY)。可以使用此语义代替SQL中的in(1,2,3)语法,并允许将值数组绑定到查询。这可以使用Oracle的JDBC驱动程序完成。

此类查询称为Pickler Fetch。它比使用SQL IN列表更具可伸缩性。我的应用程序在集合中可能有大约10,000个值。

我的问题是我是Hibernate的新手(我们使用的是Hibernate 3.2.5和Spring 2.0.6)并且没有看到如何使用Hibernate实现这种语义。 通常,JDBC实现可以像这样工作: 使用SQL * Plus中的CREATE类型在数据库中定义用户定义的类型 创建或替换类型NUMBER_LIST_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实现这样的东西?

2 个答案:

答案 0 :(得分:0)

这是过去项目的纯粹人选,但Oracle,Hibernate和Spring的组合并不稳定。 Hibernate的事务视图与Oracle不匹配,当事情失败时,它们倾向于通过Spring组件向上级联。

答案 1 :(得分:0)

我进一步研究,如果我们转向当前的Hibernate版本,我可以创建自己的JDBC DAO。我将不得不实现org.hibernate.jdbc.Work接口,但它的可行性。它将解决hibernate问题。这种方法的一个例子是: http://www.informit.com/guides/content.aspx?g=java&seqNum=575

我仍然想知道是否有更好的方法来做到这一点。特别是因为3.2.5中没有工作界面

相关问题