亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從Hibernate Criteria API獲取SQL(*不*用于記錄)

如何從Hibernate Criteria API獲取SQL(*不*用于記錄)

吃雞游戲 2019-10-08 10:54:01
有沒有一種簡單的方法可以從休眠條件中獲?。ù傻模㏒QL?理想情況下,我會像這樣:Criteria criteria = session.createCriteria(Operator.class);... build up the criteria ...... and then do something like ...String sql = criteria.toSql()(But this of course does not exist)然后的想法是將sql用作巨大的“ MINUS”查詢的一部分(我需要找到2個相同模式之間的差異-結構相同,而不是數據相同-并且Hibernate不支持MINUS)(順便說一句,我知道我可以從日志文件中檢查SQL)
查看完整描述

3 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

我已經使用Spring AOP完成了這樣的事情,因此我可以獲取應用程序中運行的任何查詢的sql,參數,錯誤和執行時間,無論是HQL,Criteria還是本機SQL。


這顯然是脆弱,不安全的,可能會因Hibernate中的更改而中斷,等等,但它說明可以獲取SQL:


CriteriaImpl c = (CriteriaImpl)query;

SessionImpl s = (SessionImpl)c.getSession();

SessionFactoryImplementor factory = (SessionFactoryImplementor)s.getSessionFactory();

String[] implementors = factory.getImplementors( c.getEntityOrClassName() );

CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),

    factory, c, implementors[0], s.getEnabledFilters());

Field f = OuterJoinLoader.class.getDeclaredField("sql");

f.setAccessible(true);

String sql = (String)f.get(loader);

嘗試將所有物品包裝起來并使用,后果自負。


查看完整回答
反對 回復 2019-10-08
?
MM們

TA貢獻1886條經驗 獲得超2個贊

這是獲取SQL的“另一種”方法:


CriteriaImpl criteriaImpl = (CriteriaImpl)criteria;

SessionImplementor session = criteriaImpl.getSession();

SessionFactoryImplementor factory = session.getFactory();

CriteriaQueryTranslator translator=new CriteriaQueryTranslator(factory,criteriaImpl,criteriaImpl.getEntityOrClassName(),CriteriaQueryTranslator.ROOT_SQL_ALIAS);

String[] implementors = factory.getImplementors( criteriaImpl.getEntityOrClassName() );


CriteriaJoinWalker walker = new CriteriaJoinWalker((OuterJoinLoadable)factory.getEntityPersister(implementors[0]), 

                        translator,

                        factory, 

                        criteriaImpl, 

                        criteriaImpl.getEntityOrClassName(), 

                        session.getLoadQueryInfluencers()   );


String sql=walker.getSQLString();


查看完整回答
反對 回復 2019-10-08
  • 3 回答
  • 0 關注
  • 1036 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號