【问题标题】:Hibernate support for Oracle Array list joins对 Oracle 数组列表连接的 Hibernate 支持
【发布时间】:2011-04-28 01:41:41
【问题描述】:

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 实现类似的功能?

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    我进一步研究,如果我们迁移到当前的 Hibernate 版本,我可以创建自己的 JDBC DAO。我将不得不实现 org.hibernate.jdbc.Work 接口,但它是可行的。它将在休眠状态下工作。该方法的一个示例如下: http://www.informit.com/guides/content.aspx?g=java&seqNum=575

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

    【讨论】:

    • 不幸的是,这种方法不适用于休眠。 Hibernate 准备好的语句不支持 Oracle 扩展。我不是 ORM 的忠实粉丝,这只是另一个原因。
    【解决方案2】:

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

    【讨论】:

    • 这不是答案。我无法选择在项目中使用 Hibernate 还是 Oracle。它是一个包含大量休眠代码的已建立代码库。 Oracle 是公司的标准。
    • 我没有得到你的答案,Hibernate+Spring+Oracle有什么问题? 14 年多来,我们有几十个使用这个堆栈的项目,没有发生任何错误。
    • 我在一个大型项目中工作,其中 Oracle 文本索引的大小为千兆字节,而 Hibernate 将与 Oracle 不同步。我认为问题不在于事务量,而在于 Oracle 缓存的压力。 Spring 使问题变得更糟,因为异常会跨线程传播,有时会占用其他代码。由于许多其他原因,该项目一团糟,但低级查询失败是最难处理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多