Как добавить подсказку к SQL-серверу в Hibernate Criteria API - PullRequest
0 голосов
/ 15 октября 2018

мы используем MS SQL-Server и Hibernate Criteria API.

Недавно я обнаружил запрос, который страдает от перехвата параметров, и поэтому я хотел бы добавить OPTION (RECOMPILE) в качестве подсказки запроса.Но хотя Hibernate, кажется, поддерживает подсказки запросов для Criteria API , добавленные

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

, похоже, не имеют никакого эффекта (зарегистрированный SQL не содержит никаких подсказок).

Есть идеи?

1 Ответ

0 голосов
/ 15 октября 2018

Похоже, что Hibernate Criteria API поддерживает подсказки запросов только для баз данных Oracle.

Лучшее решение, которое я нашел, - это реализовать поддержку SQL-Server самостоятельно (вы также можете сделать что-то вроде criteria.add(Restrictions.sqlRestriction("1=1 OPTION (RECOMPILE) "));, но это в значительной степени хак и не работает, если вы, например, хотите добавитьзаказ на запрос).

Я использовал реализацию Hibernate для Oracle в качестве схемы (взгляните на 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
...