2010-07-27 2 views
1

Тот же вопрос, что и this, только я хотел бы сделать это в Hibernate (используя грабли, если это имеет значение).Как отсортировать связанный список в hql?

Так доменный класс выглядит следующим образом

class LinkedElement { 
    LinkedElement precedingElement 
    String someData 
} 

, и я хотел бы запросить все элементы в их связанном порядке (где первый LinkedElement имеет нуль в качестве 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 

Ссылаясь на вопрос, который вы упомянули, не допускайте ошибки для синтаксически сжатого. Просто потому, что некоторые СУБД предоставят вам удобный синтаксис, они все еще решают одну и ту же проблему либо с помощью.), Выполняющего один и тот же неэффективный алгоритм, но с упрощенным синтаксисом или б.) Индексирование вещей заблаговременно, поэтому СУБД имеет доступ к вашим данным эффективно, хотя вы не моделировали его таким образом. Итак, если вам абсолютно необходимо решить эту проблему с указанной структурой данных, используя спящий режим, то вы должны посмотреть на использование Native SQL Query, настроившись на уровне базы данных, воспользовавшись преимуществами, которые ваша СУБД может предложить вам в этой области.

Если вы думаете о структуре данных, которую используете, это отлично подходит для представления стека. Вы можете нажать, поп и сверху с помощью всего лишь нескольких операций. В общем, это то, к чему подходят однонаправленные связанные списки. Для чего-то вроде очереди вам нужно подумать об использовании двунаправленного связанного списка, так как вы можете деактивировать, перенести и поставить в очередь всего пару операций. Для динамического добавления элементов в список LinkedLists великолепны. Для получения полного списка вещей, то LinkedLists сами по себе неэффективны - вы смотрите на n + 1 или n операций в зависимости от одного или двунаправленного. Вместо этого ArrayList - это путь. Хотите знать, что такое третий элемент? Прохладный, используйте его индекс. По сравнению со связанным списком, где вам нужно использовать first.getNext.getNext, это намного эффективнее! Но если вам нужно добавить материал в список или использовать его для приложения типа «очередь» или «Тип стека», то он определенно имеет свои недостатки - изменение размера массивов дорого по сравнению с добавлением новой ссылки в связанном списке.

Желаю, чтобы у меня был лучший ответ для вас, но, надеюсь, это по крайней мере полезно.

+0

Это было очень полезно, и я думаю, вы правы относительно накладных расходов и в SQL. Мой стимул для использования этого вместо индекса заключается в том, что мне нужно легко изменить положение элемента, например. от 1000-й позиции до 500-й, где первые 500-й становится 501-м, 501-й - 502-й и так далее. Хотя для этого потребуется только несколько обновлений с помощью связанного списка, в больших списках с индексом это приведет к большому количеству обновлений БД для одного изменения или есть ли другой способ избежать этого? Мне не нужно знать, что такое n-й элемент, но мне нужно эффективно запросить элементы в правильном порядке. –

Смежные вопросы