`
coolwangyu
  • 浏览: 37814 次
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

不同的sql写法提高hibernate性能,避免hibernate的BUG

阅读更多

在之前"Hibernate之查询效率问题"的文章中,谈到了一些数据库对hibernate效率的影响,<o:p></o:p>

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的不同写法,而且这也许让我们用更精炼的代码写程序。<o:p></o:p>


<o:p></o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    HibernateDAO的写法

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

    绝对惊世骇俗的SQL写法

    “Mysql神髓”这一标签进一步强调了这些SQL写法的精髓所在,意味着它们可能包含了MySQL数据库系统中的核心概念和技术,如优化查询性能、高效的数据处理以及复杂的联接操作等。这些知识对于数据库管理员和开发人员来...

    高级SQL写法

    高级SQL写法

    Hibernate中,利用Criteria查询容器实现sql的写法

    在Java的持久化框架Hibernate中,Criteria API是一种用于构建动态查询的强大工具,它允许开发者以对象化的方式构建SQL语句,而无需直接编写SQL代码。本篇将详细讲解如何在Hibernate中利用Criteria查询来实现类似SQL...

    PB脚本中SQL语句写法与SQL中语句写法对照

    PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 一、Setfilter()函数中条件写法 在PB脚本...

    DB2常用SQL写法

    在DB2中,SQL的使用是核心功能之一,对于初学者来说,掌握常见的SQL写法至关重要。 首先,我们可以看到创建和删除自定义数据类型的示例。在DB2中,可以定义自己的数据类型,比如创建了一个名为`var_newtype`的...

    sql学习 集合写法.sql

    sql学习 集合写法.sql

    高性能数据仓库引擎Sybase IQ的SQL写法

    在实际应用中,理解并熟练掌握这些SQL写法对于充分利用Sybase IQ的性能至关重要。同时,针对特定的业务需求,可能还需要深入学习分区策略、数据压缩、并行处理和性能调优等方面的知识。通过优化查询语句、合理设计...

    Hibernate_NSQL&HQL增删改操作

    在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL(Hibernate Query Language)。这两种查询方式各有优势,在不同的场景下使用可以达到最佳的效果。 ##### 一...

    ( java JDBC连接不同的数据库写法sql,oracle,mysql

    java JDBC连接不同的数据库写法sql,oracle,mysql 的很好例子

    SQL server 2000性能优化

    15. **T-SQL编写技巧**:遵循良好的编程实践,避免使用可能降低性能的写法,比如避免在查询中使用子查询,除非绝对必要。 通过这些策略和方法,可以显著提升SQL Server 2000的性能,从而更好地支持业务应用的需求。

    数据库工具,如通用日志工作存储过程,优秀SQL写法,性能优化经验,数据库管理经验,OCP

    数据库工具,如通用日志工作存储过程,优秀SQL写法,性能优化经验,数据库管理经验,OCP-OCM认证经验。_db-libary.zip

    mysql只取年月日的SQL写法.sql

    mysql只取年月日的SQL写法

    hibernate+maven demo项目工程

    **Hibernate** 是一个流行的Java持久化框架,它提供了对象关系映射(ORM)功能,将Java对象与数据库表进行映射,从而避免了繁琐的SQL代码编写。在本项目中,可以看到Hibernate是如何配置的,包括hibernate.cfg.xml...

    Hibernate框架]Hql语句in中带参数的写法

    Hibernate框架Hql语句in中带参数的写法 Hibernate框架中,在使用HQL语句时,需要传递参数,而在HQL语句中使用in关键字时,需要特别注意参数的传递方式。在本文中,我们将讨论如何在HQL语句中使用in关键字带参数的...

    sql学习 执行计划SQL写法差异改变之1_with子句.sql

    sql学习 执行计划SQL写法差异改变之1_with子句.sql

Global site tag (gtag.js) - Google Analytics