Для тех, кто хочет сделать это в одной строке (например, в Display/открывшемся окне, выражении часов или аналогичном в debug session), следующее будет делать это и «довольно печатать» SQL:
new org.hibernate.jdbc.util.BasicFormatterImpl().format((new org.hibernate.loader.criteria.CriteriaJoinWalker((org.hibernate.persister.entity.OuterJoinLoadable)((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory().getEntityPersister(((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory().getImplementors(((org.hibernate.impl.CriteriaImpl)crit).getEntityOrClassName())[0]),new org.hibernate.loader.criteria.CriteriaQueryTranslator(((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory(),((org.hibernate.impl.CriteriaImpl)crit),((org.hibernate.impl.CriteriaImpl)crit).getEntityOrClassName(),org.hibernate.loader.criteria.CriteriaQueryTranslator.ROOT_SQL_ALIAS),((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory(),(org.hibernate.impl.CriteriaImpl)crit,((org.hibernate.impl.CriteriaImpl)crit).getEntityOrClassName(),((org.hibernate.impl.CriteriaImpl)crit).getSession().getEnabledFilters())).getSQLString());
...или вот вариант легче читать:
new org.hibernate.jdbc.util.BasicFormatterImpl().format(
(new org.hibernate.loader.criteria.CriteriaJoinWalker(
(org.hibernate.persister.entity.OuterJoinLoadable)
((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory().getEntityPersister(
((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory().getImplementors(
((org.hibernate.impl.CriteriaImpl)crit).getEntityOrClassName())[0]),
new org.hibernate.loader.criteria.CriteriaQueryTranslator(
((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory(),
((org.hibernate.impl.CriteriaImpl)crit),
((org.hibernate.impl.CriteriaImpl)crit).getEntityOrClassName(),
org.hibernate.loader.criteria.CriteriaQueryTranslator.ROOT_SQL_ALIAS),
((org.hibernate.impl.CriteriaImpl)crit).getSession().getFactory(),
(org.hibernate.impl.CriteriaImpl)crit,
((org.hibernate.impl.CriteriaImpl)crit).getEntityOrClassName(),
((org.hibernate.impl.CriteriaImpl)crit).getSession().getEnabledFilters()
)
).getSQLString()
);
Примечания:
- Ответ основан на the solution posted by ramdane.i.
- Предполагается, что объект Criteria имеет имя
crit
. Если имя по-разному, выполните поиск и замените.
- Предполагается, что версия Hibernate позже 3.3.2.GA, но раньше 4.0, чтобы использовать BasicFormatterImpl для «довольно печатной» версии HQL. Если вы используете другую версию, см. this answer о том, как изменить. Или, возможно, просто удалите красивую печать целиком, так как это просто «приятно иметь».
- Она использует
getEnabledFilters
, а не getLoadQueryInfluencers()
для обратной совместимости, поскольку последний был введен в более поздней версии Hibernate (3.5 ???)
- Это не выводит фактические значения параметров, используемые, если запрос спараметрирован.
Не было бы более портативным переадресация журнала спящего режима на строку временно? –
Возможно, но если несколько потоков выполняли SQL в одно и то же время, может быть сложно определить, какие сообщения журнала идут с SQL, который вы пытаетесь захватить. Перехватчик, использующий onPrepareStatement, также предоставит вам SQL, но OP попросил способ получить SQL для данного объекта Criteria. –
Есть ли способ получить параметры SQL-запроса, распечатанные? – JRR