`
dogasshole
  • 浏览: 843673 次
文章分类
社区版块
存档分类
最新评论

Hibernate如何处理复杂的SQL

 
阅读更多

摘自:Hibernate如何处理复杂的SQL


当hibernate遇到了复杂业务的情况,不能像ibatis那么随意的定义sql再mapping xml文件里(hibernate其实也是可以的,如下:

<sql-query >
<return alias="com" />
<![CDATA[

select main.id as {com.id},
main.code as {com.code},
main.description as {com.description},
main.component_type as {com.componentType},
main.module_id as {com.moduleId},
b.mask as {com.mask}
from (SELECT a.id,
a.code,
a.description, a.component_type, a.module_id
FROM tb_component a where a.module_id =:moduleId)main
LEFT JOIN tb_component_acl b ON main.id = b.component_id
]]>
</sql-query>

)

但是你要事先定义好一个一个BO(或者叫VO,在hibernate看来,一个bo还需要一个mapping xml),在mapping文件里还得指定当前mapping的table,但是写复杂SQL,常常需要join 多张表,如何指定呢?

由此引出来一共有四种解决方案:

1.是写一个视图(view),然后generate一个对应的BO和mapping xml。这样的好处,容易维护,当做数据库方面的迁移的时候,修改的只有view的schema。但是这样为了一次复杂查询就得多出来两个文件(一个bo class一个mapping xml)。

2.就像上面说的,在mapping xml里定义一个sql-query,这样弊端就是常常要多张表,配置mapping文件比较麻烦。但是维护性比写在view里要差一些。当做数据库迁移的时候,需要改动xml文件。

3.第三种是我目前个人认为是最高效率的一种方案,就是在你的DAO里写Native SQL--注意不是hql,做过程序员的都知道,写比较纯正的sql可以解决很多复杂业务的查询。而hql却有很多限制---至少在hibernate3.0还是不那么随意自由的。比如:这样的不算复杂的sql想转换成hql就比较困难:

select main.*,c.* from (select a.* from est_step_sub_cost a,
est_job_section b where b.job_section_id =a.section_id and b.header_id=?)main
left join est_step_cost c on c.step_cost_id =main.step_cost_id;

最后没有办法,我选择了hibernate里的Native sql--其实这也不是纯正的sql,个人理解是一种介于sql 和hql之间的一种,如下:

StringBuffer hql =new StringBuffer(" select {main.*},{c.*} from (select a.* from est_step_sub_cost a, est_job_section b where b.header_id = ").append(headerId);
hql.append("and b.job_section_id =a.section_id)main left outer join est_step_cost c on c.step_cost_id =main.step_cost_id");
Query query = getSession().createSQLQuery(hql.toString()).addEntity("main",EstStepSubCost.class).addEntity("c",EstStepCost.class);
List list =query.list();
return list;

评价:这样的弊端是可能跟数据库平台依赖性比较大,在以后做数据库迁移的时候比较麻烦,我们采取的做法,确保自己的代码不要出现跟平台藕荷的sql,比如很多function或者Date方面的处理;好处就不用多说了。

但是使用这种方法的时候,需要注意,返回的这个list的存放的Object是一个Array,所以你需要自己处理,比如说当需要在页面显示的时候。

4.最后一种写hql,这种hql我个人认为在简单业务的处理,还能勉强凑合。复杂的还是,hql还是不够灵活。

而且执行的效率performance是几种当中最差的

分享到:
评论

相关推荐

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

    集成spring,hibernate,并且自写了一个sql的解析器,只有controller和service层,非常方便

    实体类对应关系处理hibernate

    自己根据课本总结的使用hibernate时,实体类间映射文件即*.hbm.xml文件的写法。如果你正在学习hibernate,保证会对你有所帮助。

    基于Hibernate OGM的SQL与NoSQL数据库的统一访问模型的设计与实现.pdf

    基于Hibernate OGM的SQL与NoSQL数据库的统一访问模型的设计与实现.pdf

    JDBC与Hibernate区别

    ◆使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言 ◆操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,...

    Hibernate存储Clob字段的方式总结

    介绍了利用Hibernate将一个长字符串转换为流存储至Clob字段中,然后再从Clob字段中读出来,转换为字符串输出的方式

    hibernate3源码

    Hibernate是一种Java语言下的对象...Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。

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

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

    Hibernate 3.2.0中文离线手册

    Hibernate是一个面向Java环境的对象...Hibernate不仅仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

    SpringMVC+Hibernate全注解整合

    &lt;prop key="hibernate.show_sql"&gt;true &lt;!-- 配置hibernateTemplate --&gt; &lt;bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"&gt; class="org....

    Hibernate+中文文档

    3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. ...

    hibernate3.2 中文参考开发手册

    Hibernate是一个面向Java... Hibernate不仅仅管理Java类到数据库表映射(包括Java数据类型到SQL数据数据的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间......

    Hibernate体系结构的概要图

    [Hibernate体系结构的概要图] ...它是可选的,开发人员也可以设计编写自己的底层事务处理代码。 Query和Criteria接口  Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式

    hibernate核心包

    antlr-2.7.6.jar 一个语言转换工具(Hibernate利用它实现 HQL 到 SQL 的转换模板相关操作需要包) c3p0-0.9.1.jar c3p0数据源实现的jar文件 cglib.jar CGLIB 字节码解释器 commons-collections-3.1.jar collections ...

    hibernate3.2中文文档(chm格式)

    3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. ...

    HibernateAPI中文版.chm

    3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. ...

    springmvc+hibernate 日志管理工具

    数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...

    Hibernate实战(第2版 中文高清版)

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不...

    Hibernate 课件及源代码

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、...

    Hibernate 多数据库支持解决方案

    Hibernate多数据库支持解决方案 一、 去掉数据库级的外键关联 二、 如何动态加载.hbm.xml文件 三、 配置文件的加载 四、 大字段处理 ...六、 Oracle 转换 SQL Server 2000注意 七、 对UTF-8数据库的特殊处理

    hibernate 教程

    处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行(Transactions And Concurrency) 10.1. 配置,会话和工厂...

Global site tag (gtag.js) - Google Analytics