在Hibernate中直接操作JDBC接口 - 编程入门网
表子记录存放于 A 实体类的 children_a, children_c 的属性中,因此 top10 的功能可以通过比较每个 A 表实体类中 children_a、children_c 的 Set 的 size 大小并进行排序得到,其代码示例如下:
清单 3. 排序代码示例
表面看来很方便,但是由于 Hibernate 是 面向对象的 O-R 映射机制,每一条 A 表记录的查询实际都关联有两条 B、C 表查询的 SQL 产生,我们 可以看到 Hibernate 的 SQL 日志中: 清单 4. Hibernate sql 日志示例
由上述 Sql 日志可以看出,每一条 A 表记录的取出,都伴随以 A 表 ID 为查 询条件关联 B,C 表中 A_ID 外键字段的 2 条取子记录的 sql,这是由 A.hbm.xml 配置中 “lazy=false”决定的。 这种情况下,当 A 和 B、C 表中数据量越来越大时,A 表取 实体的操作开销将随着 sql 查询的增多而增大,并且在紧接着的排序过程中,即使采用业界最快的快速 排序算法,排序时间依然是随原始排序实体数量的线性关系(O(n lg n)),效率会线性下降,最终无法 满足客户的前台查询的效率要求。 此类情况下如直接采用 JDBC,则只需一条如下的 SQL 语句, 即可完成该功能: 清单 5. 直接 JDBC 操作 sql
在Hibernate中直接操作JDBC接口(5)时间:2011-08-11 IBM 唐清原在以上 JDBC 方式下,即使 A、B、C 表的数据量持续增 长,仍然只有 1 条 SQL 的开销,不会出现 SQL 递增的情况,因此耗时是在可控制的区间内的。并且读 者可以注意到上述 SQL 将 3 表关联拆分成了 2 个子查询,这样避免了 3 表做笛卡尔积的数量和,进一 步提高了查询效率。由此可见,直接操作 JDBC,除 SQL 的开销可控外,还可以利用数据库层各种机制, 如上述查询语句中的 left join、子查询、索引…,灵活的调整 SQL 语句,以达到最佳的查询性 能。 由上可实例可看出,在多表关联、排序等复杂的查询情况下,Hibernate 框架由于其自身对 象封装的特殊性,不能像 JDBC 直接操作 SQL 那样很好的解决查询中高效性和灵活性方面的需求,且由 于其屏蔽了数据库的底层,开发人员看到的只是 Hibernate 提供的数据层 API,无法与灵活的使用 SQL 语句等数据库底层细节。因此,有必要在 Hibernate 框架中提供直接操作 JDBC 的接口。 在 Hibernate 框架中提供操作 JDBC 的接口的解决方案 Hibernate 的 session 机制 我们知 道 Hibernate 框架本身也是建立在 JDBC 之上的数据持久层实现,因此,要在框架本身提供操作 JDBC 的接口,需要切入其对 JDBC 封装的细节。 通过研究 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |