[英]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.