簡體   English   中英

帶有Oracle DB提示的Hibernate懶惰初始化集合

[英]Hibernate lazy initialized collection with hint for Oracle DB

我有帶有延遲初始化集合的實體:

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有時不使用該索引,而是對表使用完全掃描。 我不控制數據庫,但是(數據庫管理員)告訴我解決方案是傳遞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無法識別該提示。

您可以通過在HibernateSessionFactory上啟用use_sql_comments屬性來實現此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();

確實,這意味着您必須對代碼中的關系進行更多控制,這有點麻煩。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM