Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate Criteria API中添加SQL Server查询提示_Java_Sql Server_Hibernate_Criteria Api - Fatal编程技术网

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

Java 如何在Hibernate Criteria API中添加SQL Server查询提示,java,sql-server,hibernate,criteria-api,Java,Sql Server,Hibernate,Criteria Api,我们正在使用MS SQL Server和Hibernate标准API 最近我发现一个查询存在参数嗅探问题,因此我想添加一个选项(重新编译)作为查询提示。但是,尽管Hibernate似乎支持 criteria.addQueryHint("OPTION (RECOMPILE)"); 似乎没有任何效果(记录的SQL不包含任何提示) 有什么想法吗?Hibernate Criteria API似乎只支持Oracle数据库的查询提示 我找到的最好的解决方案是自己实现对SQL Server的支持(您也可以执

我们正在使用MS SQL Server和Hibernate标准API

最近我发现一个查询存在参数嗅探问题,因此我想添加一个
选项(重新编译)
作为查询提示。但是,尽管Hibernate似乎支持

criteria.addQueryHint("OPTION (RECOMPILE)");
似乎没有任何效果(记录的SQL不包含任何提示)


有什么想法吗?

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

我找到的最好的解决方案是自己实现对SQL Server的支持(您也可以执行类似于
criteria.add(Restrictions.sqlRestriction(“1=1选项(重新编译)”);
的操作,但这在很大程度上是一种黑客行为,如果您(例如)想向查询中添加排序,则不起作用)

我将Oracle的Hibernate实现用作蓝图(请看一下
Oracle8iDialect
)。对于我的用例,实现一个将查询提示附加到查询末尾的版本就足够了(因为
选项
-子句总是在查询的末尾)


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

我找到的最好的解决方案是自己实现对SQL Server的支持(您也可以执行类似于
criteria.add(Restrictions.sqlRestriction(“1=1选项(重新编译)”);
的操作,但这在很大程度上是一种黑客行为,如果您(例如)想向查询中添加排序,则不起作用)

我将Oracle的Hibernate实现用作蓝图(请看一下
Oracle8iDialect
)。对于我的用例,实现一个将查询提示附加到查询末尾的版本就足够了(因为
选项
-子句总是在查询的末尾)

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.dialect=de.mystuff.hibernate.MySQLServer2012Dialect