实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示。
解决办法:
<
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
>
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
>
2) 自定义MenuComparator

/** */
/**
* 菜单排序比较器
* 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为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。
<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
>
感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。
这是网上所提供的解决方案。
Hibernate在处理一对多,多对一双向关联时,用order-by应该就可以解决问题。
在处理多对多时,用最上面的方法,当相等时就可能被覆盖,这时就要有第二次比较。
public class EnterComparator implements Comparator {
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 Entertainment && o2 instanceof Entertainment) {
cc = (((Entertainment) o1).getPosition())
.compareTo(((Entertainment) o2).getPosition());
if (cc == 0) {
cc = (((Entertainment) o1).getId())
.compareTo(((Entertainment) o2).getId());
}
}
return ((cc < 0) ? 1 : (cc > 0) ? -1 : 0);
}
}
本文介绍如何在Hibernate的多对多关联中实现自定义排序,包括通过自定义比较器及使用idbag方式,并对比两者的优缺点。
31

被折叠的 条评论
为什么被折叠?



