`

Hibernate(十七): Criteria子查询与ENTITY_MAP时的问题(续一)

阅读更多

    在Hibernate(十六): DetachedCriteria子查询与ALIAS_TO_ENTITY 的 末尾,问题的焦点集中到hibernate对生成PreparedStatement的处理上. 接着再追问: 是不是Hibernate对那个preparedStatement做了什么特殊处理?  一般来说,hibernate会对一个preparedStatement做些什么样的处理?

    先看preparedStatement是怎么创建的:
        AbstractBatcher类中: prepareQueryStatement(String sql,boolean scrollable,ScrollMode scrollMode),最终在getPreparedStatement(final Connection conn,String sql,boolean scrollable,final boolean useGetGeneratedKeys,final String[] namedGeneratedKeys,final ScrollMode scrollMode,final boolean callable)方法里看到由connection.prepareStatement

    不过这里面看点不少:
        1, 对生成的sql有这么一个操作: sql = interceptor.onPrepareStatement( sql ); 默认情况是一个空的EmptyInterceptor,什么也不做.
        2, 有scrollable和callable的选择.
        3, 有useGetGeneratedKeys的判断 ==> GetGeneratedKeysHelper.prepareStatement( conn, sql );可GetGeneratedKeysHelper类里看出JDBC对某些方法是否支持.
        4, namedGeneratedKeys != null与否判断 ==> NamedGeneratedKeysHelper.prepareStatement( conn, sql, namedGeneratedKeys ),与上相似是对JDBC一些方法的判断.
        5, 最终是JDBC编程中常见的方式: result = conn.prepareStatement( sql ), 这也是问题context里生成preparedStatement的语句.

preparedStatement生成后做的一些设置:
    1, setStatementFetchSize( ps );
    2, 看到useLimit, 这么一个标志位, 这是干啥的? useLimit = useLimit( selection, dialect );是这样获得的. 现在是false的,也就不再深追.
    3, 设置查询参数:
    4, 如果 useLimit为false时, 设置setMaxRows( st, selection );不过,当前环境中没有设置.
   
上面设置完毕后, hibernate就直接到了出问题的语句上: ResultSet rs = ps.executeQuery();

这样得出结论: preparedStatement在创建过程和随后的设置过程中,并没有特殊处理.

-----

问题现场的PreparedStatement信息如下图所示:

 

 

 

    写到这里, 一个有些恐惧的疑问出现了: 难道说项目中所用apache的dbcp包对问题有影响? 毕竟这里看到都是dbcp的实例,而自己所写例子没有用到这个dbcp.

------------
    这篇帖子的标题,用了"续一"这样的字眼, 说实话,打心眼儿里想顺着这个问题也看看dbcp的源码,但有些办不从心了,还是就些打住,日后再做了断吧.

  • 大小: 19.3 KB
分享到:
评论

相关推荐

    精通Hibernate:Java对象持久化技术详解(第2版)源码1

    读者将掌握如何用面向对象的方式执行SQL查询,了解HQL的基本语法,以及更复杂的联接、子查询和聚合函数的使用。 5. **Chapter 6**:这一章可能会讨论级联操作和缓存机制。级联操作允许在父对象的操作中自动处理子...

    hibernate官方手册

    8. **Criteria API的子查询**:Criteria API支持子查询,可以在查询中嵌套另一个查询,增强了查询的灵活性。 9. **关联映射**:Hibernate支持一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多...

    hibernate课件2

    10. 联接表和子查询:理解如何在HQL中使用JOIN和子查询,以及它们在ORM中的应用。 通过【hibernate课件2】的学习,初学者能够逐步掌握Hibernate的基本用法,为实际项目开发打下坚实基础。在实践中不断巩固这些知识...

    java Hibernate 中文API文档

    5. **Criteria查询**:Hibernate提供了一种基于对象的查询方式,即Criteria API,它可以动态构建查询条件,无需编写SQL语句。通过DetachedCriteria,可以在不与数据库交互的情况下构建查询条件。 6. **HQL...

    hibernate全套学习课件ppt

    5. **Criteria查询**:除了传统的HQL(Hibernate Query Language)外,Hibernate还提供了Criteria API,允许程序员以面向对象的方式编写查询,更加灵活且易于理解和维护。 6. **事务处理**:Hibernate支持JTA(Java...

    hibernate3 中文API

    12. **集合映射(Collection Mapping)**: Hibernate支持多种集合类型(List、Set、Map等)的映射,以及一对多、多对一、一对一和多对多的关系映射。 通过阅读“Hibernate+Annotation+文档.pdf”,您可以深入学习...

    Hibernate3.2详细教程及课程笔记

    1. **对象关系映射基础**:Hibernate的核心功能是将Java对象与数据库表进行映射,通过Entity类和XML或注解配置,实现数据的持久化。学习者需要了解实体类的定义、属性映射、主键生成策略等基本概念。 2. **配置文件...

    深入浅出Hibernate.pdf

    6. 查询机制:深入研究Hibernate的查询功能,包括HQL的高级特性,如分页查询、关联查询、子查询以及动态查询。此外,还会涉及Criteria API和JPA的 Criteria 查询。 7. 关联映射:介绍不同类型的关联关系(一对一、...

    hibernate-3.4jar包

    3. **查询优化**: 使用HQL或Criteria API进行查询,避免过多的子查询,合理使用JOIN,以及避免在WHERE子句中使用非索引字段。 总结,Hibernate 3.4作为一个成熟的ORM框架,为Java开发者提供了强大而灵活的数据库...

    hibernate讲义

    - 注意避免 N+1 查询问题,合理使用 JOIN 和子查询。 11. **实体生命周期** - 新建状态(Transient):对象刚刚创建,尚未与 Session 关联。 - 持久化状态(Persistent):对象已经与 Session 关联,其变化会...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) ...

    hibernate框架2016

    - **集合映射**:如List, Set, Map等,以及一对多、多对一、一对一、多对多的关联映射。 - **级联操作**:在父对象操作时,自动处理子对象的增删改查。 - **动态模型**:允许在运行时动态创建和修改对象的映射。 **...

    hibernate-4.2.3-doc

    3. 联接查询和子查询:优化查询性能,避免 N+1 问题。 4. 延迟加载(Lazy Loading):按需加载关联对象,减少内存消耗。 5. 动态模型:无需预先定义映射文件,动态创建实体和映射。 六、最佳实践与注意事项 1. 合理...

    精通hibernate

    支持复杂的查询,如连接、子查询、聚合函数等。 十一、Criteria API Criteria API提供了一种更面向对象的方式来构建查询,与HQL相比,更动态且易于代码生成。 十二、性能优化 通过批处理、缓存、二级缓存、预加载...

    hibernate3.1-bdoc

    - **查询优化**:合理使用JOIN、子查询,避免N+1问题。 8. **最佳实践** - **设计模式应用**:如工厂模式用于SessionFactory创建,代理模式用于延迟加载。 - **事务管理**:正确配置事务边界,确保数据一致性。 ...

    hibernate总结练习源码

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行松耦合,使得在处理数据库数据时可以使用面向对象的方式。本资源包含的"hibernate总结练习源码"提供了对Hibernate ORM...

    Hibernate 5 用户手册 中文版(带目录)

    6. ** Criteria 查询**:一种灵活的查询语言,可替代SQL,以面向对象的方式编写查询。 7. **HQL(Hibernate Query Language)**:Hibernate自己的查询语言,类似于SQL,但面向对象,可用于执行复杂的查询。 **二、...

    hibernate api

    3. **Criteria查询**:Hibernate提供了一种面向对象的查询方式,即Criteria查询。开发者可以通过构建Criteria对象,添加各种限制条件来执行复杂查询,无需编写SQL语句。 4. **Query和HQL**:Hibernate Query ...

    hibernate3.0

    HQL可以更方便地进行对象查询,支持聚合函数、子查询等复杂操作。 6. **Criteria查询**:除了HQL,Hibernate还提供了Criteria API,允许开发者动态构建查询条件,适用于那些在运行时才能确定查询条件的情况。 7. *...

    hibernate3源码

    11. **Criteria API的高级特性**:包括DetachedCriteria用于离线查询,Projections用于聚合函数,Criteria与子查询的结合等。 12. **Callback事件**:Hibernate支持在对象生命周期中的某些关键点触发回调方法,如...

Global site tag (gtag.js) - Google Analytics