Как зарегистрировать функцию на диалекте из функции с параметрами до и после метода? - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь запустить JPQL с использованием функции REGEXP из базы данных MySQL 5.7 в базе данных памяти H2. Я хотел бы сделать интеграционный тест, используя тот же запрос.

Поскольку функция REGEXP не существует в H2, я пытаюсь зарегистрировать новую функцию, чтобы она работала, используя REGEXP_LIKE Вместо него функция H2 (только для тестов).

Мой запрос:

String sql = "select o1.id from order o1 where :url REGEXP o1.regex";

Но я не могу понять правильный синтаксис для регистрации функции. Я пытаюсь что-то вроде этого ниже, но я знаю, что это в любом случае неверно, потому что все примеры, которые я нашел, отображают «нормальные» функции с параметрами, но REGEXP использует синтаксис вроде :url REGEXP o1.regex, а не REGEXP(:url, o1.regex):

public class MyH2Dialect extends H2Dialect {

    public MyH2Dialect() {
        super();
        registerFunction("REGEXP", 
            new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, "REGEXP_LIKE(?1, ?2, 'i')"));
    }

}

И, естественно, JPQL не распознает функцию:

Вызывается: org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: REGEXP

Я воображаю, что мне нужно сделать что-то вроде этого (псевдокод):

registerFunction("?1 REGEXP ?2", 
    new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, "REGEXP_LIKE(?1, ?2, 'i')"));

Есть идеи?

1 Ответ

0 голосов
/ 03 февраля 2020

Я пытаюсь запустить JPQL с помощью функции REGEXP из базы данных MySQL 5.7 в базе данных памяти H2.

Хорошо, я не смог зарегистрировать функцию, но Я смог запустить функцию REGEXP в H2.

Моя ошибка заключалась в попытке использовать JPQL вместо Native Query для его запуска.

em.createNativeQuery(sql);

Когда я выполняю тот же запрос, который использовался для MySQL в базе данных H2, SQL работает как положено. Итак, мне не нужно было регистрировать функцию. Я не мог понять, что это было возможно, потому что в документации H2 не упоминается функция REGEXP, но в другом вопросе о SO упоминается, что функция существует.

Другая Вероятность, которую я обнаружил (до того, как это решение сработало), состояла в обновлении версии MySQL до версии 8.x, поскольку они создают новую функцию с именем REGEXP_LIKE, которая имеет почти такую ​​же сигнатуру из функции REGEXP_LIKE из H2.

...