`

深化学习hibernate

阅读更多

3.4.5.  查询语言中的替换

你可以使用hibernate.query.substitutions在Hibernate中定义新的查询符号. 例如:

hibernate.query.substitutions true=1, false=0						
将导致符号truefalse在生成的SQL中被翻译成整数常量.

   

2.在Hibernate配置文件中声明HQL“查询替代(query substitutions)”之后, 布尔表达式(Booleans)可以在其他表达式中轻松的使用:

<property name="hibernate.query.substitutions">true 1, false 0</property>

 

3.通过HQL的with关键字,你可以提供额外的join条件

from Cat as cat 
    left join cat.kittens as kitten 
        with kitten.bodyWeight > 10.0

4.你可以用特殊属性size, 或是特殊函数size()测试一个集合的大小。 

from Cat cat where cat.kittens.size > 0
from Cat cat where size(cat.kittens) > 0

 

 

5.使用minelementmaxelement函数来 引用到一个基本数据类型的集合中最小与最大的元素。 
from Calendar cal where maxelement(cal.holidays) > current_date

6.在传递一个集合的索引集或者是元素集(elementsindices 函数) 或者传递一个子查询的结果的时候,
可以使用SQL函数any, some, all, exists, in 
from Cat as cat 
where not exists ( 
    from Cat as mate where mate.mate = cat 
)
7.T_Payrool表中去除重复的pay_Ygxmid后的总行数
select count(distinct t.payYgxmid) from TPayroll t

可以在返回的结果数据里指定每一列的类型
8.List ls2 = session.createSQLQuery(querySql).addScalar("column_name", Hibernate.DATE).list();
这样返回的数据的时候Hiberante就会对返回的数据转换成你指定的数据类型.这个是在3.1版本就支持的操作。

9.Hibernate的fetch="join"和fetch="select"
fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询; 
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。 
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。 
另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。
在某种特殊的场合下,fetch在hql中还是起作用的。 
例如 
现有message(回帖)-->topic(主贴)-->forum(版块) 的多级many-to-one结构: 
第一级:message-->topic many-to-one配置lazy="false" fetch="join" 
第二级:topic-->forum many-to-one配置lazy="false" fetch="join" 
这时如果"from message",则第二级:topic-->forum中的fetch策略会起作用 

10.n+1问题:在默认情况下,使用query.iterator()查询,有可能有n+1问题,所谓n+1是指在查询对象的时候发出n+1条查询语句。
listiterator到区别:
list:在默认情况下,list每次都会发出sql查询实体对象,list会向缓存里放数据,但是不会利用缓存中的数据。

iterator:首先发出一条查询id列表的sql语句,如果缓存中有与之匹配的数据,就从缓存中取得数据,否则依次根据id发出sql语句。

 

11.cascade级联操作,如all, save-update, delete等 inverse反向控制 把主控方交给与此关联的类,hibernate参照另一具类来处理另外inverse有个好处就是在one方发生变化的时候,不需要牵动many同时更新数据库1、到底在哪用cascade="..."?

2、到底在哪用inverse="ture"? inverse属性默认是false的,就是说关系的两端都来维护关系

当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse= "false"或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。

在一对多关系中inverse就更有意义了。

 

12.查询总记录数

1---sql

String sql="select count(*) as count from ACCOUNT AS a "

Integer count=(Integer) getSession().createSQLQuery(sql).addScalar("count", Hibernate.INTEGER)
.uniqueResult();

也可以通过LIST对象获得 这里就不在叙述了

2---hql

String hql="select count(*) as count from Account as a";

Query query=getSession().createQuery(hql);

int count=((Number)query.iterate().next()).intValue();

 

13.如果集合被声明为lazy=true,在HQL中如果显式的使用 join fetch 则延迟加载失效。

        from eg.Cat as cat  inner join fetch cat.mate  left join fetch cat.kittens


14.在one-to-many的one端显式设置fecth="join",则无论如何都采取预先抓取(生成一个SQl),延迟加载失效(生成两个SQL)

 

15.many-to-one的延迟加载是在配置文件的class标签设置lazy="true",one-to-many和many-to-many的延迟加载是在set标签中设置lazy="true"。而one-to-one不只要在calss标签设置lazy="true",而且要在one-to-one标签中设置constrained="true".

 

16.//测试MySQL的中文问题:更改内容如下,把setName的参数改为中文的内容:

person.setName("俞黎敏");

  这里应当到hibernate.cfg.xml文件的<session-factory/>块中增加上如下两行设置

<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">GBK</property>

  这样插入数据与读取数据时才不会有中文的问题.

 

17.Hibernate中的hibernate.hbm2ddl.auto配置参数
   有以下可选的值
    validate           加载hibernate时,验证创建数据库表结构
    create             每次加载hibernate,重新创建数据库表结构
    create-drop        加载hibernate时创建,退出是删除表结构
    update             加载hibernate自动更新数据库结构
    none               不做任何处理

 

18.

集合映射

1.  映射Map:

(1)    HashMap

HashMap不保证集合中元素的顺序。

(2)    LinkedHashMap:

LinkedHashMapHashMap的子类,是一个双向链表,按照插入的顺序。

(3)    TreeMap:

虽然LinkedHashMap按照插入的顺序排序,而实际上有可能插入时没有按照一定规则,但输出时需要按一定规则输出(比如按key值的字典顺序)TreeMap实现了SortedMap接口,可以有序地取出对应位置的对象,它使用红黑树结构来排序,默认的排序方法是采用key值的升序排序。

 

Map map=new TreeMap(new CustomerComparator());//可以传入自定义的比较器

 

 

集合的排序

从数据库取得数据之后,可以从两个方面来对容器中的对象排序,一是在查询数据时在数

据库中直接使用order by 子句来排序,二是在加载数据后在JVM中排序。

在映射文件中,order-by属性用来设置数据库排序,sort属性用来设置内存排序。

排序属性:

排序属性

<map>

<set>

<list>

<bag>

<idbag>

数据库排序 (order-

by)

支持

支持

 

支持

支持

内存排序 (sort)

支持

支持

 

 

 

 

<map order-by=”name asc”>

<set sort=”test.CustomComparator”> // 自定义的比较器

 

 

分享到:
评论

相关推荐

    学习hibernate第一章内容

    在IT行业中,SSH(Struts、Spring、Hibernate)是一个经典的Java Web开发框架组合,其中Hibernate是专注于对象关系映射(ORM)的框架。...如果你对此感兴趣,可以继续关注后续的章节更新,深化对Hibernate的掌握。

    传智播客2016hibernate框架学习笔记

    《传智播客2016 Hibernate框架学习笔记》是一份详实的教程,旨在帮助初学者和进阶者深入理解和掌握Hibernate框架。...这些笔记不仅适合初学者,也为有经验的开发者提供了一个复习和深化Hibernate知识的良好资源。

    Hibernate3.2官方中文参考手册.pdf+Hibernate.pdf(Hibernate的学习资料)

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行无缝集成。在Java世界中,它极大地...同时,结合《Hibernate.pdf》这份资料,可以进一步巩固和深化理解,提升实战能力。

    黑马49期Hibernate学习

    【标题】"黑马49期Hibernate学习"是一个...学习者可以通过笔记巩固理论,通过视频理解实践,通过实战项目来检验和深化所学知识。对于想从事Java后端开发或提升数据库操作技能的人来说,这是一个非常有价值的学习资源。

    最经典的hibernate教程_从入门到精通(全四篇)

    5. 异步操作与事务管理:学习Hibernate的异步处理和事务控制,理解ACID属性在Hibernate中的应用。 【精通阶段】,将深入学习: 1. 性能优化:分析Hibernate性能瓶颈,学习如何通过批处理、懒加载、子查询优化等手段...

    hibernate_in_action 源码

    《Hibernate in Action...总的来说,通过分析《Hibernate in Action》第二版的源码,我们可以深化对Hibernate的理解,提升Java持久化开发技能,对于从事Java企业级应用开发的人员来说,这是一个非常有价值的学习资源。

    hibernate 3.3学习笔记

    **hibernate 3.3学习笔记** 在深入探讨Hibernate 3.3的学习笔记之前,首先需要理解Hibernate是什么。Hibernate是一个强大的开源Java持久化框架,它简化了数据库操作,允许开发者将精力集中在业务逻辑上而不是数据库...

    Hibernate tool 源代码

    总的来说,研究Hibernate Tool的源代码,不仅可以掌握Eclipse Plugin的开发技术,也能深化对Hibernate ORM的理解,同时还能学习到代码生成和模板引擎的实战经验。这是一次宝贵的旅程,有助于提升Java开发者的技能...

    Hibernate In Action(Java.Persistence.with.Hibernate)源码

    这些源码实例对于深化对Hibernate的理解,提高实际开发中的应用能力非常有帮助。通过阅读和运行这些代码,你可以更好地掌握Hibernate在实际项目中的应用,并能够解决在开发过程中遇到的相关问题。

    Accp6.0 Y2 Hibernate内部+阶段测试答案

    【标签】中的"Y2Hibernate"进一步强调了这是第二年学习的Hibernate部分,意味着可能已经接触过基础的Java编程和数据库知识,现在正在深化对ORM工具的理解。"自己写的 内部测试 阶段测试"标签提示了这是一次自我评估...

    spring-hibernate学习资料

    Spring 和 Hibernate 是两个在 Java 开发领域中广泛使用的开源框架,它们分别专注于应用...通过阅读提供的参考资料,你可以逐步掌握这些知识,并在实践中不断深化理解,从而成为 Spring 和 Hibernate 的熟练开发者。

    精通Hibernate(孙卫琴)

    总之,《精通Hibernate》是一本全面覆盖Hibernate各个方面的教程,无论你是Java新手还是希望深化ORM理解的开发者,都能从中受益匪浅。通过学习这本书,你将能够熟练掌握Hibernate的使用,从而提高开发效率,降低...

    Hibernate 4 学习笔记

    **标题:** Hibernate 4 学习笔记 **概述:** Hibernate 4 是一个流行的Java对象关系映射(ORM)框架,它允许开发人员在Java应用中处理...如果你对某个部分有更深入的兴趣,可以进一步查阅相关文档或教程,深化学习。

    hibernate学习资料

    总的来说,这些资料全面覆盖了Hibernate的基本使用、配置、查询以及实战技巧,无论是刚接触Hibernate的新手,还是希望深化理解的老手,都能从中受益。通过系统学习和实践,你将能够熟练运用Hibernate构建高效、稳定...

    Hibernate Quickly

    《Hibernate Quickly》是一本专注于Java领域中的Hibernate框架的入门书籍,由Patrick ...无论是对于想要学习数据库持久化技术的新手,还是希望深化对Hibernate理解的资深开发者,这本书都是一个不可多得的宝贵资源。

    hibernate应用开发完全手册(源码)

    在学习Hibernate的过程中,源码分析是提高技术水平的关键步骤。通过阅读源码,我们可以了解到Hibernate如何将Java对象与数据库表进行映射,如何执行SQL语句,以及事务管理、缓存机制、查询优化等核心功能的实现原理...

    用.NET做的hibernate练习

    描述中提到的"用.NET做的hibernate练习"进一步确认了这是一个学习或教学项目,旨在帮助开发者熟悉NHibernate在.NET中的工作方式,可能包括实体类的创建、配置文件的编写、数据库连接和会话管理等。 **hibernate知识...

    hibernate框架实例

    总结,通过这个"hibernate框架实例",你可以学习到如何在Java项目中使用Hibernate进行数据库操作,理解其基本概念、API用法以及各种映射关系。这将大大提升你的项目开发效率,减少与数据库交互的繁琐工作。实践这个...

    Hibernate源代码等相关资料

    **Hibernate 源代码分析与学习指南** Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了 Java 应用程序与数据库之间的交互。本文将深入探讨 Hibernate 源代码,帮助初学者理解其核心概念,并提供相关...

    Hibernate源码解析(三)

    《Hibernate源码解析(三)》这篇文章主要探讨了Hibernate框架的深入源码解析,这是对 Hibernate 框架理解的进一步深化。在本篇中,作者聚焦于几个关键的组件和机制,帮助读者理解 Hibernate 如何高效地管理和操作...

Global site tag (gtag.js) - Google Analytics