1. HQL基本使用
1) HQL是Hibernate框架推出一种面向对象的查询语言。
出现只能是实体类名和属性名.(不能出现表名或字段名)
2) 需要通过Query接口来执行:
Query query = session.createQuery("hql");
//给参数传值
query.setXxx(int position, 值);
query.setXxx("占位符名", 值);
//查询到多个实例
List list = query.list();
//查询单个实例
Object obj = query.setMaxResults(1)
.uniqueResult();
//查询返回迭代器
Iterator it = query.iterate();
//执行更新操作
int count = query.executeUpdate();
3) HQL的基本语法:类似标准SQL语句。
a. 格式:[select 属性名] from 实体类名 [as] 别名
where 条件
group by 分组属性
having 分组过滤条件
order by 排序条件
b. 点号运算符:.
算术运算符:+ - * /
比较运算符:> >= < <= <>(!=)
逻辑运算符:and or not
范围运算符:in、not in、between ... and..
判断null值:is null、is not null
字符串模糊匹配:like '%_' (只适用于字符串内容少的情况。尽量少用,它的效率较低)
(开源全文搜索引擎: lucene)
c. 标准函数:
字符串:length()、substring()
数字:
日期时间:current_date()、...
集合:empty()、size()、
d. 聚合函数:count()、avg()、sum()、min()、max()
如:select count(Student) from Student,结果以Long返回
e. 排序关键字: asc升序,desc降序
f. 参数绑定:
按位置绑定HQL: from Xxx where xxx>? and yyy!=?
传值代码: query.setXxx(参数位置, 值); //位置从0开始
★按参数名绑定HQL: from Xxx where xxx>:参数名1 and yyy!=:参数名2
传值代码: query.setXxx(参数名, 值);
g. 分页查询: Query接口提供了两个方法:
setMaxResults(int): 设置每次查询的最大记录数
setFirstResults(int): 设置每次查询的起始位置. 默认是0
4) 命名查询:
把HQL定义到映射文件中。xxx.hbm.xml
<query name="HQL名">
<![CDATA[HQL语句]]>
</query>
在程序代码中通过session.getNamedQuery("HQL的定义名");获取
5) 查询过滤器:
2. 集合映射(值类型: 没有OID属性。区别于实体类型)
★1) <set>元素映射Set接口:元素不重复
映射SortSet接口:元素不重复,且是排序集合
★2) <bag>元素映射Collection接口和List接口:无序,元素可重复
3) <list>元素映射List接口:元素有序,可重复。但它需要对应的表添加额外字段来记录顺序。还要进行维护。
4) <map>元素映射Map接口:键值对存放
映射SortMap接口:排序的Map
5) 排序集合:<set>和<map>可以指定sort属性为natural或排序类名。
在内存中排序。
有序集合:<set><bag><map>添加order-by属性:指定用对应表的哪些字段进行排序。
在数据库端排序。
6) 集合映射在关联关系的映射中使用较多。
3. 关联映射:把对象模型中实体类之间的关联关系映射到关系模型中表之间的外键引用关系。
1) 对象模型中,有单向和双向之分。
4. 单向多对一:对象模型和关系模型相匹配。
1) 对象模型中,"多"端实体类中持有"一"端实体类的一个引用。
关系模型中,"多"端这个表有一外键引用自"一"端那个表的主键。
2) 映射:
"多"端实体类的映射文件:
添加<many-to-one name="属性名" column="外键名" [not-null="true"]/>
"一"端实体类的映射文件不需要指定。
5. 单向一对多:对象模型和关系模型不相匹配。
1) 对象模型中,"一"端实体类中持有"多"端实体类的集合引用。
关系模型中,"多"端这个表有一外键引用自"一"端那个表的主键。
2) 映射:
"一"端实体类的映射文件:
使用集合元素来映射这个集合属性:
<set name="集合属性名" [cascade="none|save-update|delete|all"]>
<key column="外键名" [not-null="true"]/>
<one-to-many class="多端实体类名"/>
</set>
"多"端实体类的映射文件不需要指定。
3) cascade属性:用于指定操作的级联关系。
4) 一对多的单向关联是让"一"端维护关联关系。每次操作时,Hibernate内部需要多条语句才能完成这个工作。
建议映射成双向的关联,让"多"端维护关联关系。