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

时间:2018-10-15 06:57:23

标签: java sql-server hibernate criteria-api

我们正在使用MS SQL Server和Hibernate Criteria API。

最近,我发现一个查询受到参数嗅探的困扰,因此我想添加一个OPTION (RECOMPILE)作为查询提示。但是,尽管Hibernate似乎支持query hints for Criteria API,但添加的

criteria.addQueryHint("OPTION (RECOMPILE)");

似乎没有任何作用(登录的SQL不包含任何提示)。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

似乎Hibernate Criteria API仅支持Oracle数据库的查询提示。

我发现的最好的解决方案是自行实现对SQL Server的支持(您也可以执行类似criteria.add(Restrictions.sqlRestriction("1=1 OPTION (RECOMPILE) "));的操作,但这几乎是一种黑客手段,如果您想添加订单,则无法使用。到查询)。

我将Oracle的Hibernate实现用作蓝图(请看Oracle8iDialect)。在我的用例中,实现一个将查询提示附加到查询末尾的版本就足够了(因为OPTION子句始终位于查询末尾)。

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