2010-10-20 26 views
4

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

这种类型的查询称为Pickler Fetch。它比使用SQL IN列表更具可扩展性。我的应用程序可能具有〜10,000个值。

我的问题是,我是Hibernate的新手(我们使用的是Hibernate 3.2.5和Spring 2.0.6),并没有看到如何使用Hibernate来实现这种语义。 通常,JDBC实现将如下工作: 在SQL * Plus中使用CREATE类型在数据库中定义用户定义的类型 CREATE OR REPLACE TYPE NUMBER_LIST_TYPE AS TABLE OF number;

在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?

回答

0

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

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

+0

不幸的是,这种方法不适用于休眠。 Hibernate准备的语句不支持Oracle扩展。我不是ORM的忠实粉丝,这只是一个原因。 – whomer 2012-02-29 16:29:05

0

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

+0

这不是一个答案。我没有选择是否在项目中使用Hibernate或Oracle。它是一个具有大量休眠代码的已建立的代码库。 Oracle是公司的标准。 – whomer 2010-10-20 16:58:49