【Hibernate】Hibernate的集合映射与sort、order-by属性

AI权益码!Claude Code、Cursor等20+工具免费用! 购周边限时赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

常用集合Set、List、Map,相信大家都很熟悉,面试中也会经常问。Set和List都继承了Collection接口,Set是无序不可重复的,不可以存储相同的元素;而Lsit是顺序存储的,可存储重复元素。Map不是继承Collection的,Map提供key到value的映射,Map也是不可重复的(key不可重复),一个Map中不能包含相同的key,每个key只能映射一个value。

持久化类的属性是集合时,要把它们存到数据库中,需要增设数据库表来完成映射工作。例如一个学生的教育背景可能不止一个,这个时候持久化类的属性是集合,这个时候数据库就需要再提供一张数据库表来存储。


由上图可以看出,集合的映射应该怎么写了。集合的映射大致一样,我们用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:人生不要有太多的幻想,而要有更多的行动。

Hiberante 中 sort 的实现方式 http://hi.baidu.com/accpandsvse/blog/item/a12c22f23d0d1bc20a46e091.html http://hi.baidu.com/accpandsvse/blog/item/a12c22f23d0d1bc20a46e091.html 從資料庫的觀點來看,SetMap、Bag是無序的,而List是有序的,這邊所謂的無序或有序,是指將容器... 阅读详情

相关推荐

Hibernate(2)【sortorder by排序的区别

在Hiebernate集合映射关系中,排序问题<set name="addresses" table="addresses" *sort="natural"*> <key column="uid" /> <element column="address" type="string" /> </set>sort=”natural”保证了出库排序,而

Renshaoxiong的博客 1316

Hibernate实战——Set集合属性

一配置文件 <?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的DTD信息 --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http:...

实践求真知 567

Hibernate中的HQL语言

一、HQL语言简介 HQL全称是Hibernate Query Language,它提供了是十分强大的功能,它是针对持久化对象,直接取得对象,而不进行update,delete和insert等操作。而且HQL是面向对象的,具备继承,多态和关联等特性。 HQL的语法类似于SQL,其常用的方法如下: [select|update|delete 子句] [from 类名列表] [where...

weixin_33672400的博客 487

Hibernate映射集合属性3__排序用的sort属性

如果在数据库中实现不了排序,才启用这个 sort="unsorted|natural|comparatorClass" 默认为:unsorted 自然排序:natural 比较器类排序:comparatorClass user.setAddressSet(new TreeSet());// 当设置了sort属性时,就要使用SortedSet类型 user.getAddressSe

辐_射的博客 1307

Hibernate集合映射sortorder-by属性

HibernateHibernate集合映射sortorder-by属性 常用集合SetListMap,相信大家都很熟悉,面试中也会经常问。SetList都继承了Collection接口,Set是无序不可重复的,不可以存储相同的元素;而Lsit是顺序存储的,可存储重复元素。Map不是继承Collection的,Map提供key到value的映射Map也是不可重复的(key不可重复...

weixin_33835690的博客 137

bernate的集合映射sortorder-by属性

<div class="postBody"> <div id="cnblogs_post_body"><p>【HibernateHibernate集合映射sortorder-by属性</p> 常用集合SetListMap,相信大家都很熟悉,面试中也会经常问。SetList都继承了Collection接口,Set是无序不可重复的,不可以存储相同的元素;而Lsit是顺序存储

光与热的博客 765

关于Hibernate中对集合类型的映射

Each interface has a matching implementationsupported by Hibernate, and it’s important that you use the right combination. 先说一个 @JoinColumn的问题。这个注解是用来说明关联列的信息的。按自然的做法是:多在Many端上描述这些信息,因为从DB表上来看

Laurence的技术博客 1万+

Hibernate学习笔记(七)【映射值类型集合

Set [html] view plain copy hibernate-mapping >     class name="mypack.Monkey" table="MONKEYS" >       id name="id" type="long" column="ID">         generator class="increm

qqq3670279的博客 302

使用有序集合对数据进行排序

http://developer.51cto.com/art/200909/153972.htm  解读Hibernate高级集合映射     &lt;set name="aliases"                table="person_aliases"                sort="natural"&gt;      &lt;key column="...

iteye_6988的博客 206

集合排序

Hibernate支持使用SortedSetSortedMap两个有序集合,当我们需要映射这种有序集合时,应该为元素或元素指定sort属性,该属性值可以是如下3个值:        unsorted:映射有序集合时不排序。        natural:映射有序集合时使用自然排序。        java.util.Comparator实现类的类名:使用排序器对有序集合进行定制

u012365843的专栏 569

hibernate映射集合属性

ema:指定保存集合属性的数据表的schema的名称,用于覆盖根元素的schema属性; lazy:设置是否启动延迟载,默认true; inverse:指定该集合作为双向关联关系中的另一端; cascade:指定当操作持久化对象时是否让操作级联到子实体类; order-by:设置数据库对集合元素排序sort:指定集合排序顺序,可以是自然顺序,或者给定排序类进行排序; where:指定任意的SQL语句中的where条件,该条件在载或者删除几何元素时起作用,只有满足该条件的记录才会被操作;

145

hibernate一对多sortorder by

1. 從資料庫的觀點來看,SetMap、Bag是無序的,而List是有序的,這邊所謂的無序或有序,是指將容器中物件儲存至資料庫時,是否依容器物件中的順序來儲存。 2. 3. 然而從資料庫取得資料之後,您也許會希望SetMap等容器中的物件可以依一定的順序來排列,您可以從兩個層次來容器中的物件排序,一是在載入資料後於JVM中排序,另一是在資料庫中直接使用orde...

Luxika的专栏 247

hibernate的one-to-many中setsortorder-by

從資料庫的觀點來看,SetMap、Bag是無序的,而List是有序的,這邊所謂的無序或有序,是指將容器中物件儲存至資料庫時,是否依容器物件中的順序來儲存。     然而從資料庫取得資料之後,您也許會希望SetMap等容器中的物件可以依一定的順序來排列,您可以從兩個層次來容器中的物件排序,一是在載入資料後於JVM中排序,另一是在資料庫中直接使用order by子句來排序。    

2060

hibernate配置文件set标签中的where orderby sort的使用

set集合中可以使用屬性:where來增條件,使用order-by排序. &lt;set name="fileProduces"        inverse="true"        cascade="all-delete-orphan"        where="FILE_STATUS=1"        order-by="IS_PUBLISH desc,FILE_SUBMIT_TI...

一只灰机 610

Hibernate集合排序

Hibernate集合中的元素支持两种排序方式: Ø 在数据库中排序:简称为数据库排序,当Hibernate通过select语句到数据库中检索集合对象时,利用order by子句进行排序。 Ø 在内存中排序:简称为内存排序,当Hibernate把数据库中的集合数据载到内存中的Java集合中后,利用Java集合排序功能进行排序,可以选择自然排序或者客户化排序两种方式。 在映射...

张飞的IT专栏 198
上一篇: 【JS】全选、不选、反选复选框(模板)
下一篇: 【JS】根据表格ID进行排序(附注释)
励志故事
博客等级 码龄12年 99粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值