如何在hql中对链表进行排序?

时间:2010-07-27 07:31:40

标签: hibernate grails sorting hql linked-list

this相同的问题,只是我想在Hibernate中这样做(如果重要的话,使用grails)。

所以域类看起来像这样

class LinkedElement {
  LinkedElement precedingElement
  String someData
}

并且我想查询其链接顺序中的所有元素(其中第一个LinkedElement具有null作为precedingElement)。这是否有效?

1 个答案:

答案 0 :(得分:2)

您只能轻松找到位于该行前面的人(即前一个元素为空)。不幸的是,这意味着您在N + 1查询区域中获取整个列表。

Query 1 - who's in front 
Query 2 - who's behind 1
Query 3 - who's behind 2
....
Query n - who's behind n-1
Query n+1 - who's behind n -> no one is behind n, I must be at the end

参考你提到的问题,不要误认为语法简洁有效。只是因为某些DBMS会为您提供方便的语法,它们仍然通过以下方式解决相同的问题。)执行相同的低效算法但使用简化的语法或b。)提前索引事物,以便DBMS有效地访问您的数据,即使你没有那样建模。因此,如果您必须使用hibernate使用指定的数据结构来解决此问题,那么您应该考虑使用Native SQL Query,在数据库级别进行调优,利用您的DBMS可能在此区域提供的功能。

如果你考虑一下你正在使用的数据结构,它就很适合代表一个堆栈。您可以通过每个操作进行推送,弹出和顶部操作。一般来说,这就是单向链表有用的地方。对于像队列这样的东西,你需要考虑使用双向链表,因为你可以通过每个只有几个操作出列,前面和入队。为了动态地将元素添加到列表中,LinkedLists非常棒。为了按顺序获得完整的列表,那么LinkedLists本身效率很低 - 你可以根据单向或双向查看n + 1或n个操作。相反,ArrayList是要走的路。想知道第三个元素是什么?很酷,使用它的索引。与你需要使用first.getNext.getNext的链表相比,这样效率更高!但是如果你需要在列表中添加东西或者将它用于排队或堆栈类型的应用程序,那么它肯定有它的缺点 - 与在链接列表中添加新链接相比,调整数组大小是昂贵的。

我希望我有一个更好的答案,但希望这至少有点用处。