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实现这样的东西?
答案 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中没有工作界面