Я пытаюсь запустить 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')"));
Есть идеи?