关于Hibernate内存中集合排序的非常棘手的问题


说明:本人确认自己暂时确实无能力解决该问题,已经反复尝试了若干种解决方法,也看了《精通Hibernate:Java对象持久化技术详解》、《深入浅出Hibernate》、官方文档等资料。
----------------------------------------------
数据库表的简要说明:
Users 用户表
       userId   not null int primary key
           ……
SystemMenu 系统菜单表
       menuId not null int primary key
           ……
user_menu 用户与系统菜单的多对多关系的映射表
       userId   int not null   primary key
          menuId int not null   primary key
          foreign key (userId)   references Users(userId)
          foreign key (menuId) references SystemMenu (menuId)
----------------------------------------------
Users表记录:
        userId                       (其它字段省略)
        1        
SystemMenu表记录:
        menuId                     (其它字段省略)
        1        
        2
        3
        4
        5
        6
user_menu表记录:
        userId      menuId
        1        1
        1        2
        1        3
        1        4
        1        5
        1        6
----------------------------------------------
User 用户类,与Users表对应
public class
{
      private Integer userId;
      private Set systemMenus = new TreeSet();
      …………
}

SystemMenu 系统菜单类,与SystemMenu表对应
public class SystemMenu
{
      private Integer menuId;
      …………
}
----------------------------------------------
User.hbm.xml(部分简写及省略)
<hibernate-mapping>
    <class name="User" table="Users">
        <id name="userId" type="integer" column="userId">
            <generator class="native" />
        </id>
        ………………
        <set name="systemMenus" table="user_menu" lazy="false" inverse="false" order-by="menuId" sort="natural">
            <key column="userId" />
            <many-to-many column="menuId"class="SystemMenu" />
        </set>
    </class>
</hibernate-mapping>

SystemMenu.hbm.xml(部分简写及省略)
<hibernate-mapping>
    <class name="SystemMenu" table="SystemMenu">
        <id name="userId" type="integer" column="userId">
            <generator class="native" />
        </id>
        ………………
    </class>
</hibernate-mapping>
----------------------------------------------
现在的需求是:取出某一个用户(User)所对应的系统菜单(SystemMenu),也即User类中的systemMenus,取出来的数据必须是有序的,其顺序需要按照数据库表的主键的顺序来排,也即按照menuId的顺序。
----------------------------------------------
现在的问题是:通过相关的操作,系统报java类型转换出错,我大概知道是什么地方出的错。如果把User.hbm.xml这个文件中的“sort="natural"”这个删除后,一切正常,但是不能满足我的需求,因为取出的数据是无序的,每次刷新页面,迭代出来的顺序都是不一样的。难道我的User类中的systemMenus已经排序好,在最终迭代的时候,是无序的?
----------------------------------------------
我所经历的尝试与想法:
我看了Hibernate的有关书籍,关于集合在内存中排序的问题,可以指定sort="natural",但是其属性(在本例中是User类中的systemMenus)的类型必须是实现SortedSet接口的,目前在java中有TreeSet类型相对应。我尝试把User类中的systemMenus的类型由原来的TreeSet类型改为Hibernate的PersistentSortedSet,依然出错。
我想请教的是:我该怎么办才能达到我的当前需求?谢谢!
----------------------------------------------
 
    
  
        
    

非常好 还行 一般 扔鸡蛋 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount204881", 0); DWRUtil.setValue("voteNum204881", 0); </script>
免费下载IBM社区版软件体验高效开发
clican     
user face
  • Matrix排名:66
  • 排名变化:  --
  • 用户等级:6
  • 总发贴数:206
  • 总积分(Karma):2085
  • 参与分(经验):602
  • 专家分(威望):249
  • 可用分(财富):2831
  • 类型:普通用户
  • 昵称:clican
  • 注册:2005-06-27
  • 在线状态: 离线
  • 进入clican的部落格
[信息] [引用] [回复] 第 2 楼 BACK TOP

我觉得就使用order-by就能排序了,不过一定要使用iterator来迭代
至于sort 一般用来指定一个实现了Comparator接口的类作为排序方法,或被排序的bean实现了Comparable接口,这个时候用nature。(不确定,我感觉是这样的)
 
    
        
    

非常好 还行 一般 扔鸡蛋 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount204949", 0); DWRUtil.setValue("voteNum204949", 0); </script>

编辑推荐 (文章) ASM 2.0 Bytecode Framework入门
cwbnig     
user face
  • Matrix排名:3599
  • 排名变化:  +2
  • 用户等级:2
  • 总发贴数:15
  • 总积分(Karma):179
  • 参与分(经验):70
  • 专家分(威望):0
  • 可用分(财富):260
  • 类型:普通用户
  • 注册:2004-09-06
  • 在线状态: 离线
[信息] [引用] [回复] 第 3 楼 BACK TOP

回2楼的朋友:
           我确实在最终从集合取数据的时候,使用了iterator来迭代,当然,事先也使用了order-by排序了,但结果是令人遗憾的,那就是,这次迭代出来的顺序是这样的,下一次我刷新页面,那么它迭代出来的顺序又是另外的了,也即,取出来的顺序是不固定的。对于此种问题,如果我用纯粹的JDBC去实现,那是没问题的,我完全可以实现自己的需求。但是,对于Hibenate,我现在就解决不了,无法达到我的目的。非常遗憾。还恳请其他朋友真诚赐教,谢谢!
 
    
        
    

非常好 还行 一般 扔鸡蛋 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount204994", 0); DWRUtil.setValue("voteNum204994", 0); </script>

编辑推荐 (文章) PK:Websphere 免费版 VS JBOSS
yaweja     
user face
  • Matrix排名:436
  • 排名变化:  --
  • 用户等级:4
  • 总发贴数:67
  • 总积分(Karma):754
  • 参与分(经验):280
  • 专家分(威望):13
  • 可用分(财富):1090
  • 类型:普通用户
  • 注册:2005-03-11
  • 在线状态: 离线
[信息] [引用] [回复] 第 4 楼 BACK TOP

在Bean中实现排序接口,自己确定排序方法
 
    
        
    

非常好 还行 一般 扔鸡蛋 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount205097", 0); DWRUtil.setValue("voteNum205097", 0); </script>

编辑推荐 (新闻) BEA交付WebLogic Server虚拟版
cwbnig     
user face
  • Matrix排名:3599
  • 排名变化:  +2
  • 用户等级:2
  • 总发贴数:15
  • 总积分(Karma):179
  • 参与分(经验):70
  • 专家分(威望):0
  • 可用分(财富):260
  • 类型:普通用户
  • 注册:2004-09-06
  • 在线状态: 离线
[信息] [引用] [回复] 第 5 楼 BACK TOP

回第4楼的朋友:您说的方案,我早就尝试过了,结果是:虽然系统并不报错,但是迭代出来之后,仍然是无序的,仍然达不到我的目标,谢谢您的回答。
 
    
        
    

非常好 还行 一般 扔鸡蛋 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount205137", 0); DWRUtil.setValue("voteNum205137", 0); </script>

编辑推荐 (文章) JRuby:集Java和RoR之所长
ds3783     
user face
  • Matrix排名:2337
  • 排名变化:  -6
  • 用户等级:3
  • 总发贴数:54
  • 总积分(Karma):248
  • 参与分(经验):110
  • 专家分(威望):74
  • 可用分(财富):194
  • 类型:普通用户
  • 注册:2003-09-09
  • 在线状态: 离线
[信息] [引用] [回复] 第 6 楼 BACK TOP

用 order by即可 但要注意hibernate返回的是list(有序的),如果你在处理过程中变成了Set 或者其他类型,顺序信息就可能丢失了
 
    
        
    

非常好 还行 一般 扔鸡蛋 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount206639", 0); DWRUtil.setValue("voteNum206639", 0); </script>

Norther     
user photo
  • Matrix排名:31
  • 排名变化:  --
  • 用户等级:6
  • 总发贴数:480
  • 总积分(Karma):2764
  • 参与分(经验):1993
  • 专家分(威望):165
  • 可用分(财富):2409
  • 类型:普通用户
  • 昵称:草原上奔跑的烈马
  • 来自:Norther
  • 注册:2005-08-23
  • 在线状态: 离线
  • 进入Norther的部落格
[信息] [引用] [回复] 第 7 楼 BACK TOP

两种方法都可以,排序接口的方法你写的有问题吧?order by id desc 倒序 我用的时候从来也没有问题
 
    
        
    

非常好 还行 一般 扔鸡蛋 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount207013", 0); DWRUtil.setValue("voteNum207013", 0); </script>

编辑推荐 (新闻) JBoss Drools 4.0 发布
codger     
user face
  • Matrix排名:5249
  • 排名变化:  -3
  • 用户等级:2
  • 总发贴数:7
  • 总积分(Karma):134
  • 参与分(经验):28
  • 专家分(威望):0
  • 可用分(财富):230
  • 类型:普通用户
  • 注册:2006-03-10
  • 在线状态: 离线
[信息] [引用] [回复] 第 8 楼 BACK TOP

用order by 集合类型用list 得到的list根据序号去遍历 同六
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值