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

原创 2006年06月12日 11:37:00

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

hibernate本身来说,他的效率很高,但常常在项目技术时,地下的效率令人担忧,有个朋友留言提到:

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

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

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

select employeegr0_.C_OID_EMPLOYEEGRADECHANGE as C1_0_,

       salarygrad1_.C_OID_SALARYGRADEDETAIL   as C1_1_,

       。。。。。。。。。。。。。。。。。。。。。。。。

  from TB_CNB_EMPLOYEEGRADECHANGE employeegr0_,

       TB_CNB_SALARYGRADEDETAIL   salarygrad1_

 where employeegr0_.C_CHANGEID = 5308418 and

       employeegr0_.C_STRUCTUREDATEID = salarygrad1_.C_STRUCTUREDATEID and

       (employeegr0_.C_OLDROW = salarygrad1_.C_ROW and

       employeegr0_.C_OLDCOLUMN = salarygrad1_.C_COLUMN or

       employeegr0_.C_NEWROW = salarygrad1_.C_ROW and

       employeegr0_.C_NEWCOLUMN = salarygrad1_.C_COLUMN)

 order by employeegr0_.C_OPERATETIME DESC

 

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

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

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

 

 改变==========>

 

 select e.c_employeeid,

        (select d.c_value

           from  TB_CNB_SALARYGRADEDETAIL d

          where e.C_STRUCTUREDATEID = d.C_STRUCTUREDATEID and

                e.C_OLDROW = d.C_ROW and e.C_OLDCOLUMN = d.C_COLUMN) as oldvalue,

        (select d.c_value

           from  TB_CNB_SALARYGRADEDETAIL d

          where e.C_STRUCTUREDATEID = d.C_STRUCTUREDATEID and

                e.C_newROW = d.C_ROW and e.C_newCOLUMN = d.C_COLUMN) as newvalue       

  from TB_CNB_EMPLOYEEGRADECHANGE e

  where e.C_CHANGEID = 5308418

  order by newvalue

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

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

java.lang.NullPointerException

org.hibernate.hql.antlr.HqlSqlBaseWalker.aliasedSelectExpr(HqlSqlBaseWalker.java:1703)

org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1474)

org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1041)

org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:380)

org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:201)

org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:151)

org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:189)

org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:130)

org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)

org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)

org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)

org.hibernate.impl.SessionImpl.list(SessionImpl.java:834)

org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)

  改变==========>

 

  select e.c_employeeid,

        d1.c_value, d2.c_value

   from TB_CNB_EMPLOYEEGRADECHANGE e,

TB_CNB_SALARYGRADEDETAIL d1 ,

TB_CNB_SALARYGRADEDETAIL d2

  where e.C_CHANGEID = 5308418

   and e.C_STRUCTUREDATEID = d1.C_STRUCTUREDATEID and

                e.C_OLDROW = d1.C_ROW and e.C_OLDCOLUMN = d1.C_COLUMN

   and e.C_STRUCTUREDATEID = d2.C_STRUCTUREDATEID and

                e.C_newROW = d2.C_ROW and e.C_newCOLUMN = d2.C_COLUMN

  order by d2.c_value

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

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


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Hibernate的HQL查询及原生sql查询语句写法

HQL语句查询,其中省略session的生成过程(从0开始set值) public String getHistorySqZc(String zxjxjhh,String jsh,Strin...

【hibernate框架】性能优化之list_iterate的不同之处

list与iterate的不同之处: 还是用上一次的例子,话题topic和版块category Topic.java: package com.bjsxt.hibernate; import ja...

Hibernate 不同数据库的连接及SQL方言

MySQL 驱动程序 eg. mysql-connector-Java-5.0.4-bin.jar-->   org.hibernate.dialect.MySQLDialect   com.my...

Hibernate不同数据库的连接及SQL方言

本文讲述Hibernate不同数据库的连接及SQL方言。Hibernate不同数据库的连接可能会出现错误,有一种情况是由于Hibernate SQL方言设置不正确而导致的。 以下代码展示Hiberna...

如何提高hibernate性能

  • 2013-06-09 17:22
  • 31KB
  • 下载

你所不知道的提高spring+hibernate性能的一个方法---Mysql

http://www.iteye.com/topic/494179 在sprint + hibernate的应用中,你监控mysql日志,你会发现大量的log如下: Java代码 1582...

Hibernate提高性能的方法总结

Hibernate 提高性能的方法:(未完) 一、缓存机制:                缓存是介于物理数据源与应用程序之间,是对数据库中的数据...

不同数据库的参数化SQL语句的写法

之前一直没有使用Oracle,现在刚刚使用,发现他们的参数化SQL语句

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

以下是JDBC连接各种数据库的写法,献给Java初学者,提一点建议,记得导入对应的驱动jar包哦。 1、Oracle8/8i/9i数据库(thin模式) Class.forName("ora...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)