为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

斯蒂芬大帝 2021-11-17 17:30:50
我们正在使用 MS SQL-Server 和 Hibernate Criteria API。最近我发现一个查询受到参数嗅探的影响,所以我想添加一个OPTION (RECOMPILE)as 查询提示。但是虽然 Hibernate 似乎支持Criteria API的查询提示,但添加的criteria.addQueryHint("OPTION (RECOMPILE)");似乎没有任何影响(记录的 SQL 不包含任何提示)。有任何想法吗?
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

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


我找到的最好的解决方案是自己实现对 SQL-Server 的支持(您也可以做类似的事情,criteria.add(Restrictions.sqlRestriction("1=1 OPTION (RECOMPILE) "));但这几乎是一种黑客行为,如果您例如想向查询添加排序则不起作用)。


我使用 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


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 215 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信