当我们使用entityManager.createQuery(query)时,我们发现entityManager的注入对象如下:

也就是它:org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@40383b24的一个代理对象。也是一个FactoryBean.

通过这个FactoryBean就可以创建出实际代理的对象:

// Determine current EntityManager: either the transactional one
// managed by the factory or a temporary one for the given invocation.
EntityManager target = EntityManagerFactoryUtils.doGetTransactionalEntityManager(
this.targetFactory, this.properties, this.synchronizedWithTransaction); if (method.getName().equals("getTargetEntityManager")) {
// Handle EntityManagerProxy interface.
if (target == null) {
throw new IllegalStateException("No transactional EntityManager available");
}
return target;
}

最终调用的就是org.hibernate.internal.SessionImpl#createQuery(javax.persistence.criteria.CriteriaQuery<T>)

@Override
@SuppressWarnings("unchecked")
public <T> QueryImplementor<T> createQuery(CriteriaQuery<T> criteriaQuery) {
checkOpen();
try {
return (QueryImplementor<T>) criteriaCompiler().compile( (CompilableCriteria) criteriaQuery );
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}

compile方法的最后,可以看到:

return criteria.interpret( renderingContext ).buildCompiledQuery(
entityManager,
new InterpretedParameterMetadata() {
@Override
public Map<ParameterExpression<?>, ExplicitParameterInfo<?>> explicitParameterInfoMap() {
return explicitParameterInfoMap;
} @Override
public List<ImplicitParameterBinding> implicitParameterBindings() {
return implicitParameterBindings;
}
}
);

org.hibernate.query.criteria.internal.CriteriaQueryImpl#interpret方法代码如下:

    @Override
public CriteriaInterpretation interpret(RenderingContext renderingContext) {
final StringBuilder jpaqlBuffer = new StringBuilder(); queryStructure.render( jpaqlBuffer, renderingContext ); renderOrderByClause( renderingContext, jpaqlBuffer ); final String jpaqlString = jpaqlBuffer.toString(); log.debugf( "Rendered criteria query -> %s", jpaqlString );
。。。。

这里就看到了JPQL了。

继续找render方法:

public void render(StringBuilder jpaqlQuery, RenderingContext renderingContext) {
renderSelectClause( jpaqlQuery, renderingContext ); renderFromClause( jpaqlQuery, renderingContext ); renderWhereClause( jpaqlQuery, renderingContext ); renderGroupByClause( jpaqlQuery, renderingContext );
}

最新文章

  1. Spring源码分析——BeanFactory体系之接口详细分析
  2. Windows2003 IIS6.0支持32位和64位两种模式的设置方法
  3. localdb
  4. javascript的三个组成部分
  5. .project sturcture和Project Structure 无论是按快捷键或者是从files中打开都不显示
  6. mysql 获取设置环境变量
  7. OPENSSL安装 以及使用openssl中的AES加密和解密
  8. NewtonSoft.json 序列化和反序列化实例
  9. cloudera安装hadoop集群和相关服务
  10. ISO15693标准详细介绍
  11. 亚马逊记AWS(Amazon Web Services)自由EC2应用
  12. HDU 1329 Hanoi Tower Troubles Again!(乱搞)
  13. Redis-事务即简单锁应用
  14. 深入解析Javascript异步编程
  15. 201521123081《java程序设计》 第14周学习总结
  16. ●UOJ 34 多项式乘法
  17. (国内)完美下载Android源码Ubuntu版
  18. 带着新人看java虚拟机03
  19. 关闭VS2015的WPF UI调试工具
  20. https://api.highcharts.com/gantt/

热门文章

  1. mumu 连接安卓studio
  2. 关于colab的一些技巧
  3. Mac安装软件提示文件损坏
  4. 【黑马Javaweb】1.1Junit单元测试
  5. layui 表单遇到的小问题
  6. StringUtils字符串工具类左侧补齐(leftPad)、右侧补齐(rightPad)、左右两侧补齐(center)工具方法
  7. Mongdb、Mysql、Redis、Memcache场景
  8. Jmeter接口测试图文示例
  9. 从Windows系统到Linux系统转变的5大要点
  10. Python——GUI编程(python programming)