2010-07-27 91 views
1

this一樣的問題,只有我想在Hibernate中完成(如果有問題,使用grails)。如何對hql中的鏈表進行排序?

所以域類看起來像這樣

class LinkedElement { 
    LinkedElement precedingElement 
    String someData 
} 

,我想查詢所有的元素在他們的連接順序(其中第一LinkedElement具有null作爲precedingElement)。這是否有效?

回答

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會給你提供方便的語法,他們仍然可以通過a)來解決同樣的問題。)執行相同的低效算法,但是使用簡化的語法或b。)提前索引事務,以便DBMS有效地訪問數據你沒有這樣建模。因此,如果您絕對必須使用休眠來解決指定數據結構的這個問題,那麼您應該使用Native SQL Query,在數據庫級別進行調優,利用您的DBMS在此區域可能提供的功能。

如果您考慮使用的數據結構,這對於表示堆棧很有用。你可以推動,彈出和頂部,每個只需幾個操作。一般來說,這就是單向鏈接列表的優點。對於像隊列這樣的東西,你可能想考慮使用雙向鏈表,因爲你可以使用雙向操作來排隊,前排和排隊。爲了動態地將元素添加到列表中,LinkedLists非常棒。爲了整理所有事情列表,LinkedLists本身效率非常低 - 您正在尋找n + 1或n個操作,具體取決於單向還是雙向。相反,ArrayList是要走的路。想知道第三個元素是什麼?很酷,使用它的索引。與需要使用first.getNext.getNext的鏈接列表相比,這樣更高效!但是,如果您需要將東西添加到列表中或將其用於排隊或堆棧類型的應用程序,那麼它肯定有其缺點 - 調整數組的價格相比在鏈接列表中添加新鏈接而言是昂貴的。

我希望我對你有一個更好的答案,但希望這至少有用。

+0

這是非常有用的,我想你對於SQL中的開銷也是對的。我使用這個而不是索引的動機是我需要很容易地改變一個元素的位置,例如,從第1000位到第500位,前500位變爲第501位,第501位變爲第502位,依此類推。雖然這隻需要使用鏈表進行少量更新,但在帶有索引的大型列表中,它會導致大量數據庫更新進行一次更改,或者還有其他方法來避免這些更新?我不需要知道第n個元素是什麼,但我需要以正確的順序高效地查詢元素。 – 2010-07-28 06:26:27