如何在Hibernate 6中从Criteria API获取SQL语句?
解决Hibernate 6中从CriteriaQuery获取SQL字符串的问题
方案一:利用Hibernate内部编译类CriteriaCompiler
通过强制转换为Hibernate的内部CriteriaQueryImpl实现类,调用CriteriaCompiler直接编译生成SQL字符串:
import org.hibernate.query.criteria.internal.compile.CriteriaCompiler; import org.hibernate.query.criteria.internal.CriteriaQueryImpl; import org.hibernate.SessionFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; // 假设已初始化CriteriaQuery<Object> criteriaQuery和SessionFactory sessionFactory CriteriaQueryImpl<?> criteriaImpl = (CriteriaQueryImpl<?>) criteriaQuery; SessionFactoryImplementor sessionFactoryImpl = (SessionFactoryImplementor) sessionFactory; // 编译生成SQL字符串 String sql = CriteriaCompiler.compile( criteriaImpl, sessionFactoryImpl, criteriaImpl.getQueryOptions() ).getSqlStatement();
注意:该方案依赖Hibernate内部API,无官方兼容性承诺,后续版本升级可能需要调整代码。
方案二:通过QueryTranslator获取SQL
先将CriteriaQuery转换为Query实例,再通过内部的QueryTranslator生成SQL:
import org.hibernate.query.Query; import org.hibernate.query.criteria.internal.CriteriaQueryImpl; import org.hibernate.query.spi.QueryImplementor; import org.hibernate.engine.spi.SessionImplementor; // 假设已初始化Session session和CriteriaQuery<Object> criteriaQuery Query<?> query = session.createQuery(criteriaQuery); QueryImplementor<?> queryImpl = (QueryImplementor<?>) query; CriteriaQueryImpl<?> criteriaImpl = (CriteriaQueryImpl<?>) queryImpl.getQueryOptions().getCriteriaQuery(); SessionImplementor sessionImpl = session.unwrap(SessionImplementor.class); // 生成SQL字符串 String sql = sessionImpl.getFactory() .getQueryEngine() .getQueryTranslatorFactory() .createQueryTranslator( "", criteriaImpl.getQuerySpec(), sessionImpl.getLoadQueryInfluencers(), sessionImpl.getFactory() ) .getSQLString();
额外说明
- 上述方案返回的是带
?占位符的预编译SQL,如果需要替换为实际参数值,需自行处理参数绑定信息。 - 目前Hibernate 6暂无官方公开API直接获取CriteriaQuery对应的SQL字符串,只能通过这类内部实现方式。
内容的提问来源于stack exchange,提问作者BetaRide
相关产品推荐
相关产品推荐

