Как использовать функцию левой строки в hql
У меня есть SQL-запрос, как это
select column from table where path = left('INPUTSTRING', length(path));
и пытается сделать это в hql, как это,
return session.createQuery("from Table where Path = left(:input, length(Path))").
query.setParameter("input", inputPath).
.list();
и получить такую ошибку
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: left near line 1
как это сделать? Что такое соответствующая строковая функция в hql? Есть ли решение для этого, используя критерии запроса API?
2 ответа
Да, left()
не поддерживается MySQLDialect
, См. Список поддерживаемых функций HQL в документации по API.
Теперь у вас осталось 2 варианта.
- использование
session.createSQLQuery()
метод. - Создайте свой собственный
Dialect
класс, расширяяMySQLDialect
и зарегистрируйте функцию там. Об этом говорится на hibernate-форуме, который хорошо объяснен в блоге здесь.
Я не уверен, что HQL сделает это за вас, но вы можете использовать IQuery/session.CreateSQLQuery(), чтобы использовать необработанный SQL-запрос для заполнения сопоставленной сущности. Я никогда не использовал его для подстрок, но использовал его для агрегатных функций. Посмотрите главу 13 документации NHibernate и посмотрите, поможет ли это вам. Вы можете проверить подстановку запросов, доступных в Nhibernate - здесь