Как отсортировать связанный список в hql? - PullRequest
1 голос
/ 27 июля 2010

Тот же вопрос, что и , это , только я бы хотел сделать это в Hibernate (используя grails, если это важно).

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

class LinkedElement {
  LinkedElement precedingElement
  String someData
}

и я бы хотел запросить все элементы в их связанном порядке (где первый LinkedElement имеет значение null в качестве предыдущего элемента). Это возможно эффективным способом?

1 Ответ

2 голосов
/ 27 июля 2010

Вы можете легко узнать, кто находится в начале строки (т. Е. Предыдущий элемент равен нулю). К сожалению, это означает, что вы находитесь на 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

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

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

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

...