Возможности перевода в Hibernate - PullRequest
3 голосов
/ 04 декабря 2009

Наш проект должен работать как на Oracle, так и на SQL Server. Проблема в том, что у нас есть ряд собственных запросов HQL + с нестандартными операторами (например, bitand и ||) и функциями (то есть SUBSTR), которые отлично работают в Oracle, но не в SQL Server.

Интересно, способен ли Hibernate переводить их динамически? Я полагаю, что с HQL это возможно, потому что он создает AST, но я сомневаюсь, что то же самое относится и к нативным запросам.

Дополнительный вопрос: каков наилучший подход к решению этих проблемных запросов? Условия, подклассы, другие ... цель не состоит в том, чтобы изменить код много.

Спасибо заранее

Ответы [ 2 ]

3 голосов
/ 04 декабря 2009

Использование пользовательских диалектов для HQL.Вместо использования || создайте свою собственную функцию с именем concat.Затем в диалекте SQL Server добавьте это в конструктор:

registerFunction("concat", new VarArgsSQLFunction(Hibernate.STRING, "", "+", ""));

Вам не нужно менять диалект Oracle, потому что у Oracle уже есть функция concat, поэтому она просто проходит, но для других функций,вам может потребоваться зарегистрировать новые функции в обоих.

Для запросов SQL, поскольку вы все равно строите их динамически, вы можете использовать методы базового класса, например super.addBitAndClause (leftSide, rightSide).

Вы даже можете перейти к диалекту динамически, хотя Hibernate не упростил его, включив интерфейс:

Dialect d = ((SessionFactoryImpl)sessionFactory).getDialect()
1 голос
/ 04 декабря 2009

Я предлагаю переместить запросы HQL из кода во внешний файл .hbm и использовать именованные запросы перед переключением базы данных. HQL-запросы не должны быть проблемой, как вы уже сказали. Нативные запросы являются проблемой, и вы должны найти эквивалент для других СУБД. Но, поместив запросы во внешний файл, вы можете затем настроить фабрику сеансов на использование специфичного для базы данных файла .hbm, и вам не нужно изменять код, который зависит только от именованного запроса, который может быть собственным запросом или HQL. Чтобы получить именованный запрос, вы можете выполнить следующие действия:

Query query = session.getNamedQuery("YourNamedHQLorSQLQuery");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...