一对多排序的问题(多端是引用类型的数据)

来源:互联网 发布:稻草人 知乎 编辑:程序博客网 时间:2024/05/18 00:15

 对于持久层框,想必大家用的最多属Hibernate3了吧,本人在使用Hibernate3.2.6一对多(双向)碰到了很头疼的问题,后来经过自己的思索和尝试,终于搞定了Hibernate3.2.6中一对多的排序问题.
     本人拿抽奖的情况来说明下这个问题.
     如现存在抽奖期数表(JiangNum),奖品表(JiangList),中奖名单表(JiangMem);它们之间存在以下的关系.JiangNum与JiangMem之间存在一对多(双向)的关系,JiangList与JiangMem之间也存在(双向)的关系.(切记:在使用hibernate3.2.6关联中最好不要组成关联链,再加一个如JiangNum与JiangList一对多的问题就造成了关系链,这样会出现莫名其妙的问题).

      现有以下需求.要列出本期中奖的所有用户,并且按照用户的中奖等级排序,即(一等奖排前面,之后是二等奖,三等奖...),表示中奖等级的字段在JiangList表中.
       正常情况下,查出JiangNum中会查出所有的中奖用户名单,而JiangMem中含有一个JiangList的引用,是要按照引用的某个属性排序.

       hibernate3.2.6中在Hbm映射文件中Set结点中的相关配置有Sort和Orderby来控制排序,正常情况下(只能配置基本数据型),hibernate3.2.6查询多端的时候会按照配置的字段排序,Orderby是加在SQL语句中,即查询的时候排序;Sort是在查询的结果放入Set中按照某个字段进行排序.(这些只对普通的属性有用,而对于引用类型的数据不
起作用).
      本人尝试了多种方式,得出来的结果都是没有顺序的..(郁闷)
     最后本人在Action层对查询出来的结果进行迭代,之后再依次加入新创建的TreeSet(大家都知道TreeSet是有顺序的),当然在创建的时候需要加入比较器(JiangMem),即Set<JiangMem> memSet = new TreeSet<JaingMem>(new 创建的比较器),然后在前台页面迭代就可以实现排序了..也许会有人说在Pojo里面(JiangNum)里面持有JiangMem的Set时就创建TreeSet不就行了,理论没有问题,但是本人经过测试,这样是不可行的.
      如果高手们还有更好的解决方式,大家进行讨论一下!谢谢.
      本人最近发现在hibernate3.2.6里面排序的时候是可以用Orderby来做的.它是用来直接操作SQL语句的.
      使用的时候应该注意几点:
      在一的一端配置的时候代码如下: 
     

    多的一端代码如下:

orderby 里面的字段一定是多的一端中表里面的字段,另外不要延迟加载..

原创粉丝点击