|
说明:本人确认自己暂时确实无能力解决该问题,已经反复尝试了若干种解决方法,也看了《精通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社区版软件体验高效开发 |
|
- Matrix排名:66
- 排名变化: --
- 用户等级:6
- 总发贴数:206
- 总积分(Karma):2085
- 参与分(经验):602
- 专家分(威望):249
- 可用分(财富):2831
- 类型:普通用户
- 昵称:clican
- 注册:2005-06-27
- 在线状态: 离线
- 进入clican的部落格
|
|
我觉得就使用order-by就能排序了,不过一定要使用iterator来迭代 至于sort 一般用来指定一个实现了Comparator接口的类作为排序方法,或被排序的bean实现了Comparable接口,这个时候用nature。(不确定,我感觉是这样的) | | |
|
非常好 还行 一般 扔鸡蛋 | 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount204949", 0); DWRUtil.setValue("voteNum204949", 0); </script> | |
|
|
- Matrix排名:3599
- 排名变化: +2
- 用户等级:2
- 总发贴数:15
- 总积分(Karma):179
- 参与分(经验):70
- 专家分(威望):0
- 可用分(财富):260
- 类型:普通用户
- 注册:2004-09-06
- 在线状态: 离线
|
|
回2楼的朋友: 我确实在最终从集合取数据的时候,使用了iterator来迭代,当然,事先也使用了order-by排序了,但结果是令人遗憾的,那就是,这次迭代出来的顺序是这样的,下一次我刷新页面,那么它迭代出来的顺序又是另外的了,也即,取出来的顺序是不固定的。对于此种问题,如果我用纯粹的JDBC去实现,那是没问题的,我完全可以实现自己的需求。但是,对于Hibenate,我现在就解决不了,无法达到我的目的。非常遗憾。还恳请其他朋友真诚赐教,谢谢! | | |
|
非常好 还行 一般 扔鸡蛋 | 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount204994", 0); DWRUtil.setValue("voteNum204994", 0); </script> | |
|
|
- Matrix排名:436
- 排名变化: --
- 用户等级:4
- 总发贴数:67
- 总积分(Karma):754
- 参与分(经验):280
- 专家分(威望):13
- 可用分(财富):1090
- 类型:普通用户
- 注册:2005-03-11
- 在线状态: 离线
|
|
| |
|
非常好 还行 一般 扔鸡蛋 | 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount205097", 0); DWRUtil.setValue("voteNum205097", 0); </script> | |
|
|
- Matrix排名:3599
- 排名变化: +2
- 用户等级:2
- 总发贴数:15
- 总积分(Karma):179
- 参与分(经验):70
- 专家分(威望):0
- 可用分(财富):260
- 类型:普通用户
- 注册:2004-09-06
- 在线状态: 离线
|
|
回第4楼的朋友:您说的方案,我早就尝试过了,结果是:虽然系统并不报错,但是迭代出来之后,仍然是无序的,仍然达不到我的目标,谢谢您的回答。 | | |
|
非常好 还行 一般 扔鸡蛋 | 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount205137", 0); DWRUtil.setValue("voteNum205137", 0); </script> | |
|
|
- Matrix排名:2337
- 排名变化: -6
- 用户等级:3
- 总发贴数:54
- 总积分(Karma):248
- 参与分(经验):110
- 专家分(威望):74
- 可用分(财富):194
- 类型:普通用户
- 注册:2003-09-09
- 在线状态: 离线
|
|
用 order by即可 但要注意hibernate返回的是list(有序的),如果你在处理过程中变成了Set 或者其他类型,顺序信息就可能丢失了 | | |
|
非常好 还行 一般 扔鸡蛋 | 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount206639", 0); DWRUtil.setValue("voteNum206639", 0); </script> | |
|
|
- Matrix排名:31
- 排名变化: --
- 用户等级:6
- 总发贴数:480
- 总积分(Karma):2764
- 参与分(经验):1993
- 专家分(威望):165
- 可用分(财富):2409
- 类型:普通用户
- 昵称:草原上奔跑的烈马
- 来自:Norther
- 注册:2005-08-23
- 在线状态: 离线
- 进入Norther的部落格
|
|
两种方法都可以,排序接口的方法你写的有问题吧?order by id desc 倒序 我用的时候从来也没有问题 | | |
|
非常好 还行 一般 扔鸡蛋 | 总得分: 投票人次: <script type="text/javascript"> DWRUtil.setValue("voteCount207013", 0); DWRUtil.setValue("voteNum207013", 0); </script> | |
|
|
- Matrix排名:5249
- 排名变化: -3
- 用户等级:2
- 总发贴数:7
- 总积分(Karma):134
- 参与分(经验):28
- 专家分(威望):0
- 可用分(财富):230
- 类型:普通用户
- 注册:2006-03-10
- 在线状态: 离线
|
|
用order by 集合类型用list 得到的list根据序号去遍历 同六 | | |