[英]How to add SQL-Server query hint in Hibernate Criteria API
我們正在使用 MS SQL-Server 和 Hibernate Criteria API。
最近我發現了一個遭受參數嗅探的查詢,所以我想添加一個OPTION (RECOMPILE)
作為查詢提示。 但是雖然 Hibernate 似乎支持Criteria API 的查詢提示,但添加的
criteria.addQueryHint("OPTION (RECOMPILE)");
似乎沒有任何效果(記錄的 SQL 不包含任何提示)。
有任何想法嗎?
似乎Hibernate Criteria API僅支持Oracle數據庫的查詢提示。
我發現的最佳解決方案是自行實現對SQL Server的支持(您也可以做一些類似criteria.add(Restrictions.sqlRestriction("1=1 OPTION (RECOMPILE) "));
事情criteria.add(Restrictions.sqlRestriction("1=1 OPTION (RECOMPILE) "));
但這幾乎是一個hack如果您想向查詢添加排序,則該方法無效。
我將Oracle的Hibernate實現用作藍圖(請看Oracle8iDialect
)。 對於我的使用情況下,它足以實現該追加查詢提示查詢結束(作為一個版本OPTION
-clause總是在查詢結束)。
package de.mystuff.hibernate;
import java.util.List;
import org.hibernate.annotations.common.util.StringHelper;
import org.hibernate.dialect.SQLServer2008Dialect;
/**
* Special version of {@link SQLServer2008Dialect} which adds a simple query hint support.
*/
public class MySQLServer2012Dialect extends org.hibernate.dialect.SQLServer2012Dialect {
/**
* {@inheritDoc}
* <p>
* Currently this is a pretty simple query hint implementation. It just concatenates all SQL hints and adds them to the end of the query. This is fine for
* e.g. {@code OPTION (RECOMPILE)}.
*/
@Override
public String getQueryHintString(String sql, List<String> hints) {
if (hints.isEmpty()) {
// no query hints at all
return sql;
}
// concatenate all hints
final String hint = StringHelper.join(", ", hints.iterator());
if (StringHelper.isEmpty(hint)) {
// all query hints are empty
return sql;
}
return sql + " " + hint;
}
}
提醒您必須告訴Hibernate使用支持方言的查詢提示:
hibernate.dialect=de.mystuff.hibernate.MySQLServer2012Dialect
提示已添加到 org.hibernate.dialect.SQLServer2012Dialect 類中,因此請確保屬性具有
hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect<\/code>
使用 javax.persistence.EntityManager:
var query = entityManager.createQuery(criteriaQuery).unwrap(org.hibernate.query.Query.class);
query.addQueryHint("RECOMPILE");
return query.list();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.