【Hibernate】Hibernate的集合映射与sort、order-by属性
2015-06-20 09:32
567 查看
常用集合Set、List、Map,相信大家都很熟悉,面试中也会经常问。Set和List都继承了Collection接口,Set是无序不可重复的,不可以存储相同的元素;而Lsit是顺序存储的,可存储重复元素。Map不是继承Collection的,Map提供key到value的映射,Map也是不可重复的(key不可重复),一个Map中不能包含相同的key,每个key只能映射一个value。
持久化类的属性是集合时,要把它们存到数据库中,需要增设数据库表来完成映射工作。例如一个学生的教育背景可能不止一个,这个时候持久化类的属性是集合,这个时候数据库就需要再提供一张数据库表来存储。
![](http://img.blog.csdn.net/20150620093240395?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTFpHU180/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
由上图可以看出,集合的映射应该怎么写了。集合的映射大致一样,我们用Set的映射来详细说明。
name属性是指对象的集合属性名,table属性是指集合表(数据库表)的名称,key子元素是指集合外键的列名,element子元素用来存放集合元素的列的信息,order-by属性是指查询数据库时指定order by 子句,这是在数据库中的排序。对于Set的排序,还有另外一个属性sort,它是在内存中排序的,默认是unsorted,sort还有其它两个值:natural和comparatorClass,当使用sort属性时,要求使用的是可以排序的Set,例如TreeSet等。
List的映射:
List的映射与Set很相似,多了一个list-index子元素,是指定List的索引对应于集合表中的哪个字段。因为List是有序的,可以通过索引来取值。也正因为有序,所以不可以使用sort属性进行排序。
Map的映射:
map-key子元素是指定Map的key值对应集合表中的哪个字段。
除了这3个常用的集合的映射,hibernate还提供了另外两种集合的映射:数组和Bag。数组性质跟List相似,但是数组的长度不可变;Bag也与List相似,但是它是无序可重复的。因此数组的映射与List基本一样:
而Bag的映射就比List少一个list-index子元素:
使用集合属性时,一定要使用接口,而不能声明为具体实现类。因为经过session操作后,集合就变成hibernate自己的集合实现类。
最后再整理一下关于sort也order-by属性的使用:
由于Set与Map都是无序的,所以我们可以使用sort或者order-by属性对它们进行排序。sort是在内存中排序的,要求使用的Set与Map也是可排序的。这种排序方法不建议使用,使用较多的,排序也比较快的是使用order-by属性,直接在数据库中排序。
Author:立礼
Sign:人生不要有太多的幻想,而要有更多的行动。
持久化类的属性是集合时,要把它们存到数据库中,需要增设数据库表来完成映射工作。例如一个学生的教育背景可能不止一个,这个时候持久化类的属性是集合,这个时候数据库就需要再提供一张数据库表来存储。
由上图可以看出,集合的映射应该怎么写了。集合的映射大致一样,我们用Set的映射来详细说明。
<set name="education" table="student_education" order-by=" education DESC"> <key column="student_id"></key> <element type="string" column="education"></element> </set>
name属性是指对象的集合属性名,table属性是指集合表(数据库表)的名称,key子元素是指集合外键的列名,element子元素用来存放集合元素的列的信息,order-by属性是指查询数据库时指定order by 子句,这是在数据库中的排序。对于Set的排序,还有另外一个属性sort,它是在内存中排序的,默认是unsorted,sort还有其它两个值:natural和comparatorClass,当使用sort属性时,要求使用的是可以排序的Set,例如TreeSet等。
List的映射:
<list name="education" table="student_education"> <key column="student_id"></key> <list-index column="list_id"></list-index> <element type="string" column="education"></element> </list>
List的映射与Set很相似,多了一个list-index子元素,是指定List的索引对应于集合表中的哪个字段。因为List是有序的,可以通过索引来取值。也正因为有序,所以不可以使用sort属性进行排序。
Map的映射:
<p><map name="education" table="student_education"></p><p> <keycolumn="student_id"></key></p><p> <map-keytype="string" column="map_key"></map-key></p><p> <element type="string"column="education"></element></p><p></map></p>
map-key子元素是指定Map的key值对应集合表中的哪个字段。
除了这3个常用的集合的映射,hibernate还提供了另外两种集合的映射:数组和Bag。数组性质跟List相似,但是数组的长度不可变;Bag也与List相似,但是它是无序可重复的。因此数组的映射与List基本一样:
<array name="education" table="student_education"> <key column="student_id"></key> <list-index column="list_id"></list-index> <element type="string" column="education"></element> </array>
而Bag的映射就比List少一个list-index子元素:
<bag name="education" table="student_education"> <keycolumn="student_id"></key> <elementtype="string" column="education"></element> </bag>注意:
使用集合属性时,一定要使用接口,而不能声明为具体实现类。因为经过session操作后,集合就变成hibernate自己的集合实现类。
最后再整理一下关于sort也order-by属性的使用:
由于Set与Map都是无序的,所以我们可以使用sort或者order-by属性对它们进行排序。sort是在内存中排序的,要求使用的Set与Map也是可排序的。这种排序方法不建议使用,使用较多的,排序也比较快的是使用order-by属性,直接在数据库中排序。
Author:立礼
Sign:人生不要有太多的幻想,而要有更多的行动。
相关文章推荐
- 牛人:用的顺手的锤子
- VS community 2013 安装配置Xamarin
- C# Interop CorelDRAW
- Powershell目录文件夹管理权限的继承和指定方法
- JDBC事务
- js生成验证码并验证
- 水下模糊效果
- 【转】小议Bug敏感度---Bug敏感度的故事(一)
- Cocos2d-x 3.0开发(三)点击交互的四种处理
- 一篇很全面的freemarker教程
- 哈希表的建立和查找
- 从Hadoop骨架MapReduce在海量数据处理模式(包括淘宝技术架构)
- 如何在OSX上配置出优雅的控制台
- PowerShell启用winrm失败:拒绝访问 0x80070005 -2147024891
- UILabel 设置行间距 && 自动计算text 的frame
- mysql连接查询中索引的重要性
- TI C66x DSP 系统events及其应用 - 5.8(ISTP)
- WZor:Win10预览版10147无法用Win8.1密钥激活
- MySQL详解(1)----------数据类型
- C++ 基于Dijkstra算法和基于BFS算法的Ford Fulkson算法比较