强化学习hibernate
3.4.5. 查询语言中的替换
你可以使用hibernate.query.substitutions
在Hibernate中定义新的查询符号. 例如:
hibernate.query.substitutions true=1, false=0
将导致符号true
和false
在生成的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.使用minelement
与maxelement
函数来 引用到一个基本数据类型的集合中最小与最大的元素。
from Calendar cal where maxelement(cal.holidays) > current_date
6.在传递一个集合的索引集或者是元素集(elements
与indices
函数) 或者传递一个子查询的结果的时候,
可以使用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条查询语句。
list和iterator到区别:
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:
LinkedHashMap是HashMap的子类,是一个双向链表,按照插入的顺序。
(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”> // 自定义的比较器