gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:52:08 30 4
gpt4 key购买 nike

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

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

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

似乎没有任何效果(记录的 SQL 不包含任何提示)。

有什么想法吗?

最佳答案

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

关于java - 如何在 Hibernate Criteria API 中添加 SQL-Server 查询提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52811247/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com