【问题标题】:How do I sort a linked list in hql?如何在 hql 中对链表进行排序?
【发布时间】:2010-07-27 07:31:40
【问题描述】:

this 相同的问题,只是我想在 Hibernate 中执行此操作(如果重要,请使用 grails)。

所以域类看起来像这样

class LinkedElement {
  LinkedElement precedingElement
  String someData
}

并且我想按链接顺序查询所有元素(其中第一个 LinkedElement 的前一个元素为 null)。这是否可能以一种有效的方式实现?

【问题讨论】:

    标签: hibernate grails sorting hql linked-list


    【解决方案1】:

    您只能轻松找出谁在行首(即前面的元素为空)。不幸的是,这意味着您要在 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 会为您提供方便的语法,它们仍然通过以下方式解决相同的问题:a.) 执行相同的低效算法但使用简化的语法或 b.) 提前索引事物,以便 DBMS 可以有效地访问您的数据,即使你没有那样建模。因此,如果您绝对必须使用 hibernate 使用指定的数据结构来解决这个问题,那么您应该考虑使用Native SQL Query,在数据库级别进行调整,利用您的 DBMS 在这方面可能为您提供的功能。

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

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

    【讨论】:

    • 这非常有帮助,我想您对 SQL 中的开销也是正确的。我使用它而不是索引的动机是我需要轻松更改元素的位置,例如从第 1000 位到第 500 位,其中前 500 位变为第 501 位,第 501 位变为第 502 位,依此类推。虽然这只需要使用链接列表进行一些更新,但在具有索引的大型列表中,它会导致一次更改导致大量数据库更新,或者是否有另一种方法可以避免这些?我不需要知道第 n 个元素是什么,但我需要以正确的顺序高效地查询元素。
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多