簡體   English   中英

"如何在 Hibernate Criteria API 中添加 SQL-Server 查詢提示"

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

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