2013-04-29 3 views
1

Я использую HQL-именованные запросы (которые определены в файлах XML) для запроса моей базы данных с помощью Hibernate. Некоторые из запросов довольно сложны, и я нахожу, что я копирую несколько важных частей одного запроса в другой, похожий.Повторное использование HQL с именами фрагментов запросов

Мне было интересно, можно ли вообще определить общие части в «именованном фрагменте запроса» и повторно использовать этот фрагмент во всех моих запросах?

Я не хочу использовать критерии API, кстати, потому что мне удобнее формулировать запросы в XML. Некоторые из них уже довольно монстры, и реализация их с помощью API сделает их еще более нечитаемыми.

ответ

-1

Вы можете получить конкретный объект реализации, развернув запрос &, затем можете извлечь из него данные.

javax.persistence.Query query = entityManager.createNamedQuery(NAMED_QUERY_X); 
org.hibernate.Query hibernateQuery = query.unwrap(org.hibernate.Query.class); 
String sqlQuery = hibernateQuery.getQueryString(); 

javax.persistence.Query # разворачивать: Возвращает объект указанного типа для обеспечения доступа к провайдеру конкретного API. Если запрос провайдера не поддерживает указанный класс, генерируется исключение PersistentException .

org.hibernate.Query # getQueryString: Получить строку запроса.

+0

Это была бы возможность, но звучит как взлома. Нет поддержки на языке HQL для этого, например, в MyBatis? –

+0

@StefanHaberl Я не знаком с MyBatis. Как уже упоминалось выше, это зависит от реализации, специфичного для провайдера API. Но вы используете Hibernate, попробовали ли вы это. –

+1

Я предполагаю, что он будет работать с Hibernate в порядке. Просто я не хочу бороться с Hibernate, сгенерированным SQL в моем коде. Я хочу построить HQL-запросы из именованных блоков запроса запроса в XML и хочу сделать этот SQL-диалект независимым. –

Смежные вопросы