1

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

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 管理员)解决此问题的方法是为 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;

是否有任何简单的方法可以强制休眠将这些附加信息附加到生成的 SQL 查询中?我不想因为一些 Oracle 错误或配置错误而重写整个应用程序。

我使用休眠 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 中测试过,如果放在 SELECT 语句之前,Oracle 似乎无法识别此提示。

4

1 回答 1

0

use_sql_comments您可以通过启用以下属性来实现此目的HibernateSessionFactory

<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();

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

祝你好运!

于 2014-05-22T11:18:01.013 回答