订购多个一对多关系

Mar*_*kis 5 java hibernate seam sql-order-by

我有一个搜索屏幕,下面使用JSF,JBoss Seam和Hibernate.有和,列的列A,关系如下:BC

A (1< --; >*) B (1< --; >*) C
Run Code Online (Sandbox Code Playgroud)

假设A有一个List< B >并且B有一个List< C >(两个关系都是一对多).

UI表支持按任何列(ASC或DESC)排序,因此我希望对查询结果进行排序.这就是我在模型中使用Lists的原因.

但是,我得到一个例外,即Hibernate不能急切地获取多个行李(它认为两个行李都是行李).有一个有趣的博客文章在这里,和他们确定了以下解决方案:

  1. 使用@IndexColumn`注释(我的数据库中没有,更重要的是,我希望结果的位置由排序决定,而不是由索引列确定)
  2. 懒惰取出(出于性能原因,我需要急切的抓取)
  3. 将列表更改为设置

我将List更改为Set,顺便提一下,模型方面更正确.

  • 首先,如果不使用@OrderBy,PersistentSetHibernate返回的包装HashSet,没有排序.因此,当我在UI中迭代它时,顺序是随机的,无论数据库的顺序如何.
  • 其次,如果我使用@OrderBy的PersistentSet身体包裹LinkedHashSet,里面有订货,并且是我想什么.但是,该OrderBy属性是硬编码的,并且优先于我使用集合(链接)或HQL(链接)设置的任何顺序.因此,我通过UI请求的所有其他排序都在它之后.

我再次尝试Sets使用SortedSet(和它的实现TreeSet),但我有一些问题:

  1. 我想要在DB中进行排序,而不是在内存中,这是TreeSet通过比较器或通过元素的Comparable接口进行的.

  2. 我发现有一个Hibernate注释@Sort,它有一个SortOrder.UNSORTED,你也可以设置一个比较器.我还没有设法让它编译,但我仍然不相信它是我需要的.

其中一个要求是在DB中进行排序.

创建了一个简单的Maven项目并将其作为Google Code项目提交.这是我个人解决问题的方法.

Pét*_*rök 3

当相同的结果集可以按任何列重新排序时,在数据库中排序的意义何在?如果每次在 UI 上单击不同的列时都需要访问数据库,那么您只会给自己带来性能问题。当在内存中对集合进行排序有意义时,情况正是如此。

关于包和列表,Hibernate 博克是这么说的:

袋子可能无法分类(不幸的是TreeBag,没有分类),列表也不能分类;列表元素的顺序由列表索引定义。