Hibernate为Oracle数据库延迟初始化集合



我有一个延迟初始化集合的实体:

SomeEntity someEntity = template.findByNamedQuery("queryName", entityId);
if (someEntity != null) {
    Hibernate.initialize(someEntity.getChildCollection());
}

Hibernate生成SQL

SELECT 
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

列COLX上有索引IDX_COLX。

但是由于某些未知的原因,有时Oracle不使用这个索引,而对表使用全扫描。我不控制DB,但我被告知(由DB管理员),解决方案是传递提示给Oracle。

像这样:

SELECT /*+ index(t IDX_COLX) */
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;
是否有任何简单的方法来强制hibernate附加这些附加信息到生成的SQL查询?我不想因为一些Oracle错误或错误配置而重写整个应用程序。

我使用hibernate 3.3.2.

编辑:

我尝试了StuPointerException给出的解决方案,生成的SQL看起来像:

/*+ index(t IDX_COLX) */
SELECT
  t.COL1 AS COL1_,
  t.COL2 AS COL2_,
  ...
  t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;

在Oracle SQL Developer中测试,看起来Oracle不识别这个提示,如果放在SELECT语句之前。

您可以通过在HibernateSessionFactory上启用属性use_sql_comments来实现这一点:

<property name="use_sql_comments">true</property>

你可以这样做:

String hql = "from SomeEntity e where e.COLX = :colx";
List result = session.createQuery(hql)
        .setString("colx", "xyz")
        .setComment("+ index(t IDX_COLX)")
        .list();

这确实意味着你必须在代码中对关系进行更多的控制,这有点痛苦。

祝你好运!

相关内容

  • 没有找到相关文章