注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Lable

........................................

 
 
 

日志

 
 

4_HQL进阶  

2011-12-19 11:17:18|  分类: Hibernate |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

一、对Hibernate进行性能优化

       数据库设计

       HQL优化

       配置参数

       方法使用

       缓存管理

二、HQL优化(以下列出操作会使索引失效)

       避免 or 操作       解决办法:使用 in 条件来替换

       避免使用 not       解决办法:使用比较运算符来代替not,不大于就是小于等于

       避免 like 的特殊形式

       避免 having 子句   解决办法:尽可能在where中指定条件

       避免使用 distinct  解决办法:在不要求完全冗余时,应避免使用distinct

三、数据加载方式

       即时加载:当实体加载完成后,立即加载其关联的数据

       延迟加载:当在真正需要数据的时候,才执行数据加载操作

类型

类级别

关联级别

优点

缺点

立即检索

立即加载检索方法指定的对象

立即加载与检索方法指定的对象关联的对象,可以设定批量检索数量

对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地从一个对象导航到与它关联的对象

(1)select语句数目多

(2)可能会加载应用程序不需要访问的对象,造成内存空间的浪费

延迟检索

延迟加载检索方法指定的对象

延迟加载与检索方法指定的对象关联的对象,可以设定批量检索数量

由应用程序决定需要加载那些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。提高检索性能,节省内存空间

应用程序如果希望访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化

具体操作:

类级别的即时加载:

1、  调用get方法,立即加载

2、  调用 load方法,需要在class节点中添加lazy=“false”

类级别的延迟加载

1、  必须使用load()方法才能生效

2、  修改实体映射文件,在class节点中添加lazy=“true”

 

关联级别的即时加载

1、  修改实体映射文件,在关联属性中设置lazy=“false”

关联级别的延迟加载

1、  默认就是延迟加载,不需要写lazy属性

 

属性级别的即时加载

1、  默认就是即时加载

属性级别的延迟加载

1、  在映射文件的属性中设置lazy=“true”

2、  使用 ant 对实体类的字节码进行二次编译

四、list()方法和iterate()方法

       使用list()方法获取查询结果,每次发出一条查询语句,获取全部数据。List方法不会在缓存中读取数据,它总是一次性的从数据库中直接查询所有符合条件的数据,同时将获取的数据写入缓存

       使用iterate()方法获取查询结果,先发出一条sql语句用来查询满足条件数据的id,然后依次按这些id查询记录,也就是执行N+1条sql语句(N为符合条件的记录数)。Iterate()方法获取了符合条件的数据id后,首先根据id在缓存中寻找符合条件的数据,若缓存中无符合条件的数据,再到数据库中查询

五、HQL连接查询

       HQL支持的连接查询:

       内连接            inner join 或 join

       迫切内连接        inner join fetch 或 join fetch

       左外连接          left outer join 或 left join

       迫切左外连接      left outer join fetch 或 left join fetch

       右外连接          right outer join 或 right join

注意:fetch 关键字表明 “右表”对象读出后立即填充到对应的“左表”对象中,也就是说,此时返回的结果是一个表,否则,返回的结果是一个对象数组,里面包括查到的两张表的数据信息

六、命名查询(配置在映射文件中)

将SQL保存在配置文件中,需要调用的时候再进行读取

语法:

<query name=“loginUser”>

    <![CDATA[

        from User u where u.name = :name and u.password = :pwd

    ]]>

</query>

       <query>元素用于定义一个HQL查询语句,他和<class>元素并列

       在程序中通过session对象的getNamedQuery()方法获得该查询语句

七、本地SQL查询

    :将HQL语句写成sql语句

    使用SQLQuery接口,使用Session 的createSQLQuery(String sql)方法利用传入的sql参数获得SQLQuery实例,同时使用addEntity()方法将别名与实体类联系在一起、

    e.g.:

        String sql = “select {u.*} from users u where u.name=’admin’”

        SQLQuery squery = createSQLQuery(sql).addEntity(“u”,User.class);

        List result = squery.list();

       将本地SQL查询定义在映射文件中

<sql-query name=“loginUser”>

    <![CDATA[

        select {u.*} from user

    ]]>

    <return alias=“u” class=“cn.jbit.houserent.bean.User”>

</sql-query>

       使用<sql-query>元素的子元素<return>指定别名与实体类的关联

       alias属性用于指定别名

       class属性用于指定实体类

       此时在程序中创建使用的是query对象

  评论这张
 
阅读(12)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017