Конкретная функция HQL - PullRequest
1 голос
/ 25 мая 2011

Моя подчеркнутая база данных - сервер MS SQL. Я использую HQL-запрос через Java Hibernate. Если я использую функцию замены внутри concat, это неправильно интерпретирует запрос. Например:

HQL Query : from Project  where replace('\\\\yyy\\\\','\\\\','\\\\\\\\') like concat(replace(projectPathPrefix,'\\\\','\\\\\\\\\\\\\\\\')),'%') and sourceControlSystems=3

SQL interpretation : select * from PRJ_project project where (replace('\\ooo\\', '\\', '\\\\') like replace(project0_.project_path_prefix+'\\'+'\\\\\\\\')+'%' and source_control_system_id=3

Он также преобразует запятые , функции замены в +, поскольку внешние скобки содержат функцию concat. Это прекрасно работает, если необлагаемая база данных - MySQL или Oracle, поскольку обе используют функцию concat. Но поскольку SQL-сервер использует оператор «+» для конкатенации, HQL заменит функцию concat на + очень абсурдным образом. Пожалуйста, предложите какое-то решение для этого.

1 Ответ

0 голосов
/ 25 мая 2011

Вы нажали на ошибку http://opensource.atlassian.com/projects/hibernate/browse/HHH-4963, Я думаю. Как указывается в отчете об ошибке, вы можете обойти эту ошибку, определив и используя собственный диалект (с помощью подкласса SQLServer2008Dialect) и зарегистрировав функцию замены:

@Override
protected void registerFunctions() {
    super.registerFunction();
    registerFunction("replace", new StandardSQLFunction("replace", StandardBasicTypes.STRING));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...