`
dev_liu
  • 浏览: 111017 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate性能问题(关于他的bug和sql写法)

阅读更多
hibernate本身来说,他的效率很高,但常常在项目技术时,地下的效率令人担忧,有个朋友留言提到:<o:p></o:p>

"hibernate 慢一般都是自己设计的问题,本来你用JDBC的时候很简单的一个SQL,你设计放到hibernate 中为了关联,就变成了一个复合SQL,能不慢么?"<o:p></o:p>

确实,由于我们在写代码的时候,在ORM的作用下,越来越少的关心数据库了,也许是面向对象的思想对我们残毒太深,总会把简单的东西复杂化。<o:p></o:p>

下面说一个查询改变的历程:[一下都是系统将hibernate查询或是hql翻译后的sql]<o:p></o:p>

select employeegr0_.C_OID_EMPLOYEEGRADECHANGE as C1_0_,<o:p></o:p>

       salarygrad1_.C_OID_SALARYGRADEDETAIL   as C1_1_,<o:p></o:p>

       。。。。。。。。。。。。。。。。。。。。。。。。<o:p></o:p>

  from TB_CNB_EMPLOYEEGRADECHANGE employeegr0_,<o:p></o:p>

       TB_CNB_SALARYGRADEDETAIL   salarygrad1_<o:p></o:p>

 where employeegr0_.C_CHANGEID = 5308418 and<o:p></o:p>

       employeegr0_.C_STRUCTUREDATEID = salarygrad1_.C_STRUCTUREDATEID and<o:p></o:p>

       (employeegr0_.C_OLDROW = salarygrad1_.C_ROW and<o:p></o:p>

       employeegr0_.C_OLDCOLUMN = salarygrad1_.C_COLUMN or<o:p></o:p>

       employeegr0_.C_NEWROW = salarygrad1_.C_ROW and<o:p></o:p>

       employeegr0_.C_NEWCOLUMN = salarygrad1_.C_COLUMN)<o:p></o:p>

 order by employeegr0_.C_OPERATETIME DESC<o:p></o:p>

 <o:p></o:p>

 表结构就不介绍了,大概说一下意图吧,就是表TB_CNB_EMPLOYEEGRADECHANGE 可能对应12条表TB_CNB_SALARYGRADEDETAIL的记录。<o:p></o:p>

 这样的写法,在获得数据后,需要自己写代码合并,比如通过Mapkey验证将2个需要合并的对象合并,当然你也可以改写对象的<o:p></o:p>

 equals hascode方法,不过这需要根据具体业务,这里适合,2条记录的数据对我都有用,嘿嘿 ! 可惜这种写法在分页显示的要求下被淘汰了。<o:p></o:p>

 <o:p></o:p>

 改变==========><o:p></o:p>

 <o:p></o:p>

 select e.c_employeeid,<o:p></o:p>

        (select d.c_value<o:p></o:p>

           from  TB_CNB_SALARYGRADEDETAIL d<o:p></o:p>

          where e.C_STRUCTUREDATEID = d.C_STRUCTUREDATEID and<o:p></o:p>

                e.C_OLDROW = d.C_ROW and e.C_OLDCOLUMN = d.C_COLUMN) as oldvalue,<o:p></o:p>

        (select d.c_value<o:p></o:p>

           from  TB_CNB_SALARYGRADEDETAIL d<o:p></o:p>

          where e.C_STRUCTUREDATEID = d.C_STRUCTUREDATEID and<o:p></o:p>

                e.C_newROW = d.C_ROW and e.C_newCOLUMN = d.C_COLUMN) as newvalue        <o:p></o:p>

  from TB_CNB_EMPLOYEEGRADECHANGE e<o:p></o:p>

  where e.C_CHANGEID = 5308418<o:p></o:p>

  order by newvalue<o:p></o:p>

  这个写法简单,查询出后,不需要自己手动合并,而且可以实现分页显示的功能,不过这时高兴早了些,这样的查询如果用hql写出来执行,<o:p></o:p>

  会出错,因为hibernate目前有Bug,不支持这样的写法法。无奈!如果你运行hibernate发现下面异常时,也许就是hibernate不支持你的sql写法。<o:p></o:p>

java.lang.NullPointerException<o:p></o:p>

org.hibernate.hql.antlr.HqlSqlBaseWalker.aliasedSelectExpr(HqlSqlBaseWalker.java:1703)<o:p></o:p>

org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1474)<o:p></o:p>

org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1041)<o:p></o:p>

org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:380)<o:p></o:p>

org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:201)<o:p></o:p>

org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:151)<o:p></o:p>

org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:189)<o:p></o:p>

org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:130)<o:p></o:p>

org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)<o:p></o:p>

org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)<o:p></o:p>

org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)<o:p></o:p>

org.hibernate.impl.SessionImpl.list(SessionImpl.java:834)<o:p></o:p>

org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)<o:p></o:p>

  改变==========><o:p></o:p>

  <o:p></o:p>

  select e.c_employeeid,<o:p></o:p>

        d1.c_value, d2.c_value<o:p></o:p>

   from TB_CNB_EMPLOYEEGRADECHANGE e,<o:p></o:p>

TB_CNB_SALARYGRADEDETAIL d1 ,<o:p></o:p>

TB_CNB_SALARYGRADEDETAIL d2 <o:p></o:p>

  where e.C_CHANGEID = 5308418 <o:p></o:p>

   and e.C_STRUCTUREDATEID = d1.C_STRUCTUREDATEID and<o:p></o:p>

                e.C_OLDROW = d1.C_ROW and e.C_OLDCOLUMN = d1.C_COLUMN<o:p></o:p>

   and e.C_STRUCTUREDATEID = d2.C_STRUCTUREDATEID and<o:p></o:p>

                e.C_newROW = d2.C_ROW and e.C_newCOLUMN = d2.C_COLUMN<o:p></o:p>

  order by d2.c_value<o:p></o:p>

  这样写法可以获得和上面相同的结果,不同的是hibernate对这种写法是支持的,也方便的实现分页功能。<o:p></o:p>

  总结性的说,为了提高hibernate效率或者是避开一些hibernateBug,我们要灵活运行sql的不同写法,而且这也许让我们用更精炼的代码写程序。

分享到:
评论

相关推荐

    hibernate显示不带?的完整sql

    在开发过程中,为了调试和优化SQL查询,有时我们需要查看Hibernate生成的完整SQL语句,包括其参数值。通常,Hibernate默认输出的SQL语句会用问号(?)作为占位符,这在理解查询逻辑时可能会带来不便。本文将详细介绍...

    hibernate实现动态SQL查询

    本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...

    hibernate增删改查和动态sql

    6. **Maven Webapp:** 提到的"curd2 Maven Webapp"可能是指一个使用Maven构建的Web应用程序,其中包含了一个名为"curd2"的模块,这个模块可能包含了上述关于Hibernate CRUD操作和动态SQL的实现。 综上所述,这个...

    Hibernate使用xdoclet生成映射文件和sql语句

    为了解决这一问题,XDoclet应运而生,它是一款自动化工具,能够根据Java源代码自动生成Hibernate所需的映射文件和SQL语句。 XDoclet是基于Javadoc的元数据处理工具,它通过读取Java源代码中的特定注解,自动生成...

    提升Hibernate性能的魔方——IronTrack SQL.pdf

    IronTrack SQL是基于Apache许可证的开源工具,通过与开源JDBC驱动p6spy合作,提供了一个增强的对基于Hibernate的数据库应用的可视化调试和性能评测手段。 当开发者初次接触Hibernate时,他们通常会寻找方法来监控...

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...

    Struts 1.1、Hibernate 3.0和SQL Server 2005数据库驱动包

    Struts 1.1、Hibernate 3.0 和 SQL Server 2005 数据库驱动包是构建基于Java的企业级Web应用程序的关键组件。这些技术在2000年代中期广泛应用于开发面向服务架构(SOA)和模型视图控制器(MVC)模式的系统。 Struts...

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    总的来说,这个项目是一个基于Spring和Hibernate的后端解决方案,通过自定义SQL解析器实现了类似MyBatis的功能,旨在提供一种轻便、灵活的方式来处理数据库操作。这样的设计对于快速开发、小团队或者特定场景下的...

    HibernateDAO的写法

    - 封装:DAO类应封装具体的SQL查询和HQL(Hibernate Query Language)语句,避免在业务层暴露这些细节。 - 单一职责:每个DAO类应只负责一种类型的数据操作,如用户DAO只处理用户相关的操作。 - 可复用:设计通用的...

    Hibernate中Sql语句

    ### Hibernate中使用SQL而非HQL语句的知识点详解 在Java开发中,Hibernate作为一个...通过以上分析可以看出,在Hibernate中使用原生SQL能够更灵活地处理复杂的数据库查询需求,同时也需要注意安全性和性能方面的考量。

    hibernate 执行原生sql的几种方式

    在Java的持久化框架Hibernate中,执行原生SQL(Native SQL)是常见需求,尤其是在处理特定数据库...在大多数情况下,应尽量利用Hibernate的ORM能力,但在处理特定数据库特性和性能优化时,原生SQL是不可或缺的工具。

    Hibernate 函数 ,子查询 和原生SQL查询

    在使用原生SQL时,需要注意的是,你需要自己处理结果的映射和事务管理,这可能比使用HQL(Hibernate查询语言)更加复杂。 总结,Hibernate提供了丰富的函数支持,使得我们在处理数据时更加便捷。同时,子查询功能...

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    在IT行业中,数据库操作是应用...理解并熟练掌握Hibernate的核心概念和API,是解决连接SQL问题的关键。通过细致的配置检查、错误排查以及对ORM机制的深入理解,我们可以有效应对各种挑战,确保数据库操作的顺利进行。

    hibernate数据库通用SQL代码

    在Java开发中,Hibernate是一个非常流行的持久化框架,它简化了与数据库的交互,使得开发者可以更专注于业务逻辑而不是底层的SQL操作。本文将详细讲解如何使用Hibernate来编写通用的数据库操作代码,包括插入...

    关于Hibernate分页类和jdbc的sql分页完美融合

    然而,虽然这种方式简单易用,但当处理大数据集时,可能会遇到性能问题,因为Hibernate会加载所有满足条件的结果到内存中,然后再返回指定范围的结果。为了解决这个问题,我们可以利用JDBC的SQL分页来直接在数据库...

    Hibernate性能优化研究.pdf

    ### Hibernate性能优化研究 #### 一、引言 随着企业级应用的发展,高效的数据持久化技术成为了提升系统性能的...通过合理的配置和策略调整,可以在很大程度上缓解性能瓶颈问题,从而构建出更为高效稳定的企业级应用。

    hibernate将本地SQL查询结果封装成对象

    在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...

    sqlserver的hibernate

    **SQLServer与Hibernate的整合应用** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是底层的SQL语句。本教程将介绍如何使用Hibernate操作...

    让hibernate输出sql语句参数配置.doc

    hibernate.format_sql 参数用于在 log 和 console 中打印出更漂亮的 SQL。其取值为 true 或 false。当设置为 true 时,Hibernate 将格式化 SQL 语句,提高可读性和调试效率。 4. hibernate.default_schema ...

Global site tag (gtag.js) - Google Analytics