为了账号安全,请及时绑定邮箱和手机立即绑定

如何从Hibernate Criteria API获取SQL(*不*用于记录)

如何从Hibernate Criteria API获取SQL(*不*用于记录)

吃鸡游戏 2019-10-08 10:54:01
有没有一种简单的方法可以从休眠条件中获取(待生成的)SQL?理想情况下,我会像这样: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 关注
  • 1010 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信