@OrderBy и SortedSet: почему этого следует избегать?

Я читал статью о составлении карт коллекций и их заказе. и была фраза:

Не следует использовать его с SortedSets, чтобы избежать дополнительной сортировки уже заказанные сущности.

Я не мог понять это утверждение. для меня это было неясно. что это за дополнительная сортировка?

и я также видел много примеров по этой проблеме, и ни один из них не использует @OrderBy с SortedSet. и все они пытались использовать SortedSet с @SortNatural и @Sort.

Почему никто не использует @OrderBy с SortedSet?

однако я видел много примеров, в которых @OrderBy используется с SortedMap? в чем разница между этими двумя (SortedSet и SortedMap), когда мы пытаемся использовать @OrderBy?

«что это за дополнительная сортировка» Я думаю, это просто говорит о том, что у вас есть 1) сортировка записей, полученных из БД, с помощью ORDER BY и 2) сортировка с помощью SortedSet; и вам не нужно делать и то, и другое.

Andy Turner 16.04.2024 17:43

К вашему сведению, SortedSet имеет подинтерфейс NavigableSet в Java 6+ и суперинтерфейсы SequencedSet и SequencedCollection в Java 21+. Тот же совет применим.

Basil Bourque 16.04.2024 18:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@OrderBy приводит к появлению предложения ORDER BY в сгенерированном SQL. ORDER BY пункты не изменяют получаемые вами результаты; он просто изменяет порядок получения результатов.

Большинство наборов полностью игнорируют порядок размещения в них элементов:

HashSet<String> set = new HashSet<String>();
set.add("Hello"); // line 1
set.add("World"); // line 2
for (String elem : set) System.out.println(elem);

Вышеупомянутое произвольно печатает «Привет», затем «Мир» или «Мир», затем «Привет» (порядок зависит от хеш-кода, который не имеет значения. Отсюда слово «произвольный» — оно не случайное — на него нельзя положиться). он другой, и вам определенно не следует полагаться на него там, где требуется случайность, поэтому в этом есть порядок, но этот порядок не имеет никакого значения. Кроме того, замена строк 1 и 2 не влияет на вывод этого кода.

Большинство наборов работают таким образом (порядок, в котором вы кладете вещи, не влияет на результат; только то, что вы кладете, а не то, в каком порядке вы их кладете). В частности, все SortedSets работают таким образом, потому что по определению отсортированный набор будет всегда сохранять свое содержимое отсортированным, что тривиально означает, что порядок, в котором вы помещаете в него элементы, не имеет значения.

И вот в чем дело: если вы просите свою БД потратить время на упорядочивание вещей, а затем взять результат и поместить элементы в набор, который игнорирует порядок, который вы ей придали, это… глупо. Бессмысленная трата времени. Итак, использовать @OrderBy — глупо для большинства наборов и глупо для всех SortedSets. Единственный часто используемый набор в Java, для которого он полезен, — это LinkedHashSet, который явно определен для поддержания порядка, в котором вы помещаете в него элементы. Несмотря на то, что HashSet не является SortedSet, использовать @OrderBy для последующего помещения элементов в HashSet «работает» и глупо. Часть @OrderBy не имеет никакого эффекта, кроме траты ресурсов БД. То же самое для любого SortedSet и почти для всех других вещей, реализующих Set (кроме LinkedHashSet и очень немногих других, чьи документы явно указывают, что они сохраняют порядок вставки).

Другие вопросы по теме

Похожие вопросы

Как переместить определенное значение в конец массива, не затрагивая порядок других элементов?
Как напечатать выражения, которые удовлетворяют определенному мной правилу синтаксического анализа?
Могу ли я поместить утверждение в класс символов в регулярном выражении?
Как развернуть файл войны на сервере приложений Tomcat
Для команды нет обработчика. WorkbenchContext localValues ​​больше не ссылается на классы обработчиков
В Keycloak, как автоматически отозвать предыдущий токен, когда мы генерируем новый токен при весенней загрузке?
Изменение элементов внутри массива
StringIndexOutOfBoundException возникает при вводе чего-либо в текстовое поле JavaFX как в JDK21, так и в JDK8, Windows11
String ArrayList Подсчитывает появление первых букв и возвращает символ, который встречается чаще всего
Невозможно использовать ассоциации в представлении после обновления Hibernate