對於希望這樣做在單個線(任何人都在顯示/立即窗口,手錶表達或以類似的例如調試會話),以下將這樣做和「漂亮打印」的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()
爲了向後兼容,因爲後者是在休眠(3.5 ???)的更高版本引入
- 它不輸出用於如果該查詢是參數化的實際參數值。
將hibernate日誌暫時重定向到字符串會不會更具可移植性? – 2011-08-15 13:28:12
可能,但是如果多個線程同時執行SQL,可能很難確定哪條日誌消息與您嘗試捕獲的SQL一起運行。使用onPrepareStatement的攔截器也會讓你獲得SQL,但是OP要求一種獲得給定Criteria對象的SQL的方法。 – 2011-08-15 21:26:01
有沒有辦法可以打印出SQL查詢的參數? – JRR 2013-05-11 12:51:06