强化学习hibernate

深化学习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”> // 自定义的比较器