Как использовать функцию левой строки в 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 варианта.

  1. использованиеsession.createSQLQuery()метод.
  2. Создайте свой собственный Dialectкласс, расширяяMySQLDialect и зарегистрируйте функцию там. Об этом говорится на hibernate-форуме, который хорошо объяснен в блоге здесь.

Я не уверен, что HQL сделает это за вас, но вы можете использовать IQuery/session.CreateSQLQuery(), чтобы использовать необработанный SQL-запрос для заполнения сопоставленной сущности. Я никогда не использовал его для подстрок, но использовал его для агрегатных функций. Посмотрите главу 13 документации NHibernate и посмотрите, поможет ли это вам. Вы можете проверить подстановку запросов, доступных в Nhibernate - здесь

Другие вопросы по тегам