Hibernate3集合映射中排序功能的一些不足?

在Hibernate3中,若要对Set集合映射进行排序,有如下方法

1.使用Java排序(内存排序):

< set  name ="mySet"  sort ="org.mypack.MyElementComparator" >
    < key  column ="fk_column_id"   />
    < one-to-many  class ="org.mypack.MyElement"   />
</ set >

其中“org.mypack.MyElementComparator”为实现了“java.util.Comparator”接口的比较器类

2.使用SQL查询排序:

< set  name ="mySet"  order-by ="index_column asc" >
    < key  column ="fk_column_id"   />
    < one-to-many  class ="org.mypack.MyElement"   />
</ set >

对两种方法我各感觉有些不足:

第1种方法,好像无法方便地指定反向排序,除非把Comparator再反过来写一遍。可否再加个xml属性以控制正向还是反向?
效率的话,由于更底层的实现方式我也不知道,具体不知道如何,只是感觉上比第2种方法效率低些。

第2种方法,对于基本的映射没什么问题,也可以通过“asc/desc”控制正向或反向排序,但是有这样一种情况:
集合中的元素类是一个使用<joined-subclass>映射的类,此类在数据库中涉及到两张表,在Java中则是对另一个实体类扩展后的子类,Java中的超类对应于数据库中的“主表”,子类则对应于数据库中的“副表”。
如果要排序的字段是位于“副表”中的,使用“order-by”也没有问题。
如果要排序的字段是位于“主表”中的,使用“order-by”的话Hibernate则无法自动识别并生成正确的SQL语句了。

要解决这个问题,我倒试出了一个可能不可靠的办法:
查看Hibernate生成的SQL语句,可以发现,其最后生成的“order by”子句是依据查询时给表起的别名访问其字段的,像上面这种情况,这个别名就是“副表”的别名。于是我在配置文件中手动指定一个“主表”的别名:
order-by="别名.index_column"
这样效果就可以实现了,Hibernate不会再愚蠢地去查“副表”了。
不过这样有个很“严重”的问题,那个“别名”好像是由Hibernate随意生成的,如果哪次它换了一个别名的话……
还是用上面方法1比较可靠……

以上。也许还有我所不了解的……

你可能感兴趣的:(Hibernate3集合映射中排序功能的一些不足?)