java - 订购多个一对多关系

标签 java hibernate sql-order-by seam

我有一个搜索屏幕,在下面使用 JSF、JBoss Seam 和 Hibernate。有 A 的列, B , 和 C ,其中关系如下:

A (1< --; >*) B (1< --; >*) C

假设A有一个 List< B >B有一个 List< C > (两种关系都是一对多的)。

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

但是,我遇到一个异常,即 Hibernate 无法急切地获取多个包(它认为两个列表都是包)。有一篇有趣的博文 here , 他们确定了以下解决方案:

  1. 使用@IndexColumn`注解(我的数据库中没有,而且我希望结果的位置由顺序决定,而不是由索引列决定)
  2. 延迟获取(出于性能原因,我需要急切获取)
  3. 更改要设置的列表

我将 List 更改为 Set,顺便说一下,这在模型方面更正确。

  • 首先,如果不使用@OrderBy,PersistentSet Hibernate 返回的包装了一个 HashSet , 没有顺序。因此,当我在 UI 中对其进行迭代时,顺序是随机的,无论数据库的顺序如何。
  • 其次,如果我确实使用@OrderBy,PersistentSet包装 LinkedHashSet ,它有顺序,是我想要的。 但是OrderBy属性是硬编码的,并且优先于我使用集合(link)或 HQL(link)设置的任何顺序。因此,我通过 UI 请求的所有其他排序都在它之后。

我再次尝试 Sets , 并使用 SortedSet (及其实现,TreeSet),但我有一些问题:

  1. 我希望在数据库中而不是在内存中进行排序,这就是 TreeSet做(通过 Comparator 或通过元素的 Comparable 接口(interface))。

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

要求之一是在数据库中进行排序。

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

最佳答案

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

关于bags和lists,Hibernate bok是这么说的:

Bags may not be sorted (there is no TreeBag, unfortunately), nor may lists; the order of list elements is defined by the list index.

关于java - 订购多个一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2622233/

相关文章:

java - Hibernate 5.x 迁移建议脚本

sql - SQL : Force a value to be last in the order 中的按最后排序

java - 将字符串数组转换为 ArrayList

java - Intellij 格式化。与正文不同的缩进的中断方法

hibernate - 如何设置Hibernate Gradle插件来增强字节码?

java - 如何展平 Hibernate 查询的结果

php - 使用 Mysql 查找即将到来的生日

sql - 0 在升序排序时排在最后

java - 解析器忽略的 Xml 默认属性值

网络上的 Java 序列化