« | October 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | |
| 公告 |
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。 |
Blog信息 |
blog名称: 日志总数:210 评论数量:205 留言数量:-19 访问次数:923837 建立时间:2007年5月10日 |

| |
[Hibernate]Hibernate中对set的集合的排序解决办法 文章收藏, 网上资源, 软件技术, 电脑与网络
李小白 发表于 2007/7/19 10:55:27 |
lhwork 发表于 2007-1-20 10:58:47
问题:Hibernate的<many-to-many>双向关联中,一方加载另一方时,怎么样达到按自定义规则排序的目的呢?
实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示。
解决办法:
1. 通过在hbm配置文件中配置解决,需要自定义比较器。
1) 在多对多的主控端指定sort属性
这里的主控端为role,受控端为menu。
role的配置为:
500)this.width=500'>500)this.width=500" align=top border=0><set name="roleMenus" table="ROLE_MENU" inverse="false" lazy="false" sort="menu.MenuComparator">500)this.width=500'>500)this.width=500" align=top border=0> <key column="RM_ROLE_ROLE_ID" />500)this.width=500'>500)this.width=500" align=top border=0> <many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" /> 500)this.width=500'>500)this.width=500" align=top border=0> </set>menu的配置为:
500)this.width=500'>500)this.width=500" align=top border=0><set name="roleMenus" table="ROLE_MENU">500)this.width=500'>500)this.width=500" align=top border=0> <key column="RM_MENU_MENU_ID" />500)this.width=500'>500)this.width=500" align=top border=0> <many-to-many column="RM_ROLE_ROLE_ID" class="domain.RoleInfoVO" /> 500)this.width=500'>500)this.width=500" align=top border=0> </set>2) 自定义MenuComparator
这里需要实现Comparator接口,自定义比较器
500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>/** *//**500)this.width=500'>500)this.width=500" align=top border=0> * 菜单排序比较器500)this.width=500'>500)this.width=500" align=top border=0> * MenuComparator500)this.width=500'>500)this.width=500" align=top border=0> * @author allen500)this.width=500'>500)this.width=500" align=top border=0> */500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0>public class MenuComparator implements Comparator 500)this.width=500'>500)this.width=500" border=0>{500)this.width=500'>500)this.width=500" align=top border=0> 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0> /** *//**500)this.width=500'>500)this.width=500" align=top border=0> * 按照菜单的ID进行排序 500)this.width=500'>500)this.width=500" align=top border=0> * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)500)this.width=500'>500)this.width=500" align=top border=0> */500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0> public int compare(Object o1, Object o2) 500)this.width=500'>500)this.width=500" border=0>{500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0> if(o1 == null)500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0> return (o2 == null) ? 0 : 1; 500)this.width=500'>500)this.width=500" align=top border=0> } 500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0> if(o2 == null)500)this.width=500'>500)this.width=500" border=0>{ 500)this.width=500'>500)this.width=500" align=top border=0> return -1; 500)this.width=500'>500)this.width=500" align=top border=0> }500)this.width=500'>500)this.width=500" align=top border=0> int cc = 0;500)this.width=500'>500)this.width=500" align=top border=0>500)this.width=500'>500)this.width=500" align=top border=0> if (o1 instanceof MenuInfoVO && o2 instanceof MenuInfoVO) 500)this.width=500'>500)this.width=500" border=0>{500)this.width=500'>500)this.width=500" align=top border=0> 500)this.width=500'>500)this.width=500" align=top border=0> cc = (((MenuInfoVO)o1).getId()).compareTo(((MenuInfoVO)o2).getId());500)this.width=500'>500)this.width=500" align=top border=0> }500)this.width=500'>500)this.width=500" align=top border=0> return ((cc < 0) ? -1 : (cc > 0) ? 1 : 0);500)this.width=500'>500)this.width=500" align=top border=0> }500)this.width=500'>500)this.width=500" align=top border=0>}500)this.width=500'>500)this.width=500" align=top border=0>我在这里是以菜单的ID为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。
2. 使用idbag为关系表增加一个主键。
<idbag>可以理解为人工的id生成器,就好像是实体类一样!集合的每一行都有一个不同的人造关键字。但是,Hibernate没有提供任何机制来让你取得某个特定行的人造关键字。注意<idbag>的更新性能要比普通的<bag>高得多!Hibernate可以有效的定位到不同的行,分别进行更新或删除工作,就如同处理一个list, map或者set一样。
500)this.width=500'>500)this.width=500" align=top border=0><idbag name="roleMenus" table="ROLE_MENU" order-by="RM_MENU_MENU_ID desc"> 500)this.width=500'>500)this.width=500" align=top border=0> <meta attribute="field-description">菜单列表</meta> 500)this.width=500'>500)this.width=500" align=top border=0> <collection-id column="id" type="java.lang.Long"> 500)this.width=500'>500)this.width=500" align=top border=0> <meta attribute="field-description">主键</meta> 500)this.width=500'>500)this.width=500" align=top border=0> <generator /> 500)this.width=500'>500)this.width=500" align=top border=0> </collection-id> 500)this.width=500'>500)this.width=500" align=top border=0> <key column="RM_ROLE_ROLE_ID"/> 500)this.width=500'>500)this.width=500" align=top border=0> <many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" /> 500)this.width=500'>500)this.width=500" align=top border=0></idbag> 感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。 |
|
|