Für alle, die dies in einer einzelnen Zeile tun möchten (z. B. im Anzeige- / Sofortfenster, einem Überwachungsausdruck oder ähnlichem in einer Debug-Sitzung), wird Folgendes ausgeführt und die SQL "hübsch gedruckt":
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());
... oder hier ist eine leichter zu lesende Version:
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()
);
Anmerkungen:
- Die Antwort basiert auf der von ramdane.i veröffentlichten Lösung .
- Es wird davon ausgegangen, dass das Criteria- Objekt benannt ist
crit
. Wenn anders benannt, suchen und ersetzen .
- Es wird davon ausgegangen, dass die Hibernate-Version später als 3.3.2.GA, aber früher als 4.0 ist, um BasicFormatterImpl zum "hübschen Drucken" der HQL zu verwenden. Wenn Sie eine andere Version verwenden, finden Sie in dieser Antwort Informationen zum Ändern. Oder entfernen Sie den hübschen Druck einfach ganz, da er nur "schön zu haben" ist .
- Es wird
getEnabledFilters
eher verwendet als getLoadQueryInfluencers()
aus Gründen der Abwärtskompatibilität, da letzteres in einer späteren Version von Hibernate (3.5 ???) eingeführt wurde.
- Die tatsächlich verwendeten Parameterwerte werden nicht ausgegeben, wenn die Abfrage parametrisiert ist.