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