You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:17:09