Hibernate 中对set的集合的排序解决办法
来源:互联网 发布:崔杼杀史官 知乎 编辑:程序博客网 时间:2024/03/28 16:24
问题:Hibernate的<many-to-many>双向关联中,一方加载另一方时,怎么样达到按自定义规则排序的目的呢?
实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示。
解决办法:
1. 通过在hbm配置文件中配置解决,需要自定义比较器。
1) 在多对多的主控端指定sort属性
这里的主控端为role,受控端为menu。
role的配置为:
<set name="roleMenus" table="ROLE_MENU" inverse="false" lazy="false" sort="menu.MenuComparator">
<key column="RM_ROLE_ROLE_ID" />
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</set>
<key column="RM_ROLE_ROLE_ID" />
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</set>
menu的配置为:
<set name="roleMenus" table="ROLE_MENU">
<key column="RM_MENU_MENU_ID" />
<many-to-many column="RM_ROLE_ROLE_ID" class="domain.RoleInfoVO" />
</set>
<key column="RM_MENU_MENU_ID" />
<many-to-many column="RM_ROLE_ROLE_ID" class="domain.RoleInfoVO" />
</set>
2) 自定义MenuComparator 这里需要实现Comparator接口,自定义比较器
/**
* 菜单排序比较器
* MenuComparator
* @author allen
*/
public class MenuComparator implements Comparator {
/**
* 按照菜单的ID进行排序
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object o1, Object o2) {
if(o1 == null){
return (o2 == null) ? 0 : 1;
}
if(o2 == null){
return -1;
}
int cc = 0;
if (o1 instanceof MenuInfoVO && o2 instanceof MenuInfoVO) {
cc = (((MenuInfoVO)o1).getId()).compareTo(((MenuInfoVO)o2).getId());
}
return ((cc < 0) ? -1 : (cc > 0) ? 1 : 0);
}
}
* 菜单排序比较器
* MenuComparator
* @author allen
*/
public class MenuComparator implements Comparator {
/**
* 按照菜单的ID进行排序
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object o1, Object o2) {
if(o1 == null){
return (o2 == null) ? 0 : 1;
}
if(o2 == null){
return -1;
}
int cc = 0;
if (o1 instanceof MenuInfoVO && o2 instanceof MenuInfoVO) {
cc = (((MenuInfoVO)o1).getId()).compareTo(((MenuInfoVO)o2).getId());
}
return ((cc < 0) ? -1 : (cc > 0) ? 1 : 0);
}
}
我在这里是以菜单的ID为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。
2. 使用idbag为关系表增加一个主键。
<idbag>可以理解为人工的id生成器,就好像是实体类一样!集合的每一行都有一个不同的人造关键字。但是,Hibernate没有提供任何机制来让你取得某个特定行的人造关键字。注意
感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。
<idbag>
的更新性能要比普通的<bag>
高得多!Hibernate可以有效的定位到不同的行,分别进行更新或删除工作,就如同处理一个list, map或者set一样。<idbag name="roleMenus" table="ROLE_MENU" order-by="RM_MENU_MENU_ID desc">
<meta attribute="field-description">菜单列表</meta>
<collection-id column="id" type="java.lang.Long">
<meta attribute="field-description">主键</meta>
<generator />
</collection-id>
<key column="RM_ROLE_ROLE_ID"/>
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</idbag>
<meta attribute="field-description">菜单列表</meta>
<collection-id column="id" type="java.lang.Long">
<meta attribute="field-description">主键</meta>
<generator />
</collection-id>
<key column="RM_ROLE_ROLE_ID"/>
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</idbag>
感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。
- Hibernate 中对set的集合的排序解决办法
- 对hibernate的set集合进行排序
- 对hibernate的set集合进行排序
- 对hibernate的set集合进行排序
- 针对hibernate中 Set 集合 的排序
- 对hibernate的set集合进行排序2
- Hibernate中Set集合排序
- set集合的排序
- Hibernate中hbm文件Set集合顺序对级联插入和删除的影响问题
- Hibernate的set排序
- Hibernate的set排序
- Hibernate Set集合排序
- Hibernate 注解:一、多对多中set集合按指定字段排序
- hibernate 一对多查询对set的排序
- hibernate 一对多查询对set的排序
- hibernate中给集合排序的方法
- hibernate中给集合排序的方法
- hibernate中给集合排序的方法
- 消除div之间的影响
- Java【动态绑定、静态绑定】-动态绑定
- access数据库+SQL带OleDbParameter参数开发小企业网站
- android 退出程序
- 堆 栈 的区别
- Hibernate 中对set的集合的排序解决办法
- HttpWatch工具简介及使用技巧
- 在MyEclipse当中安装jbpm
- JAVA面试题解惑系列(一)——类的初始化顺序
- 在十六进制字符串与数值类型之间转换
- SQL2000的sysindexes视图在SQL2005中的另类表现
- WIN32 API 多线程编程学习笔记
- 数据结构学习——查找表
- .Net compact framework 界面自适应输入法