Я читал статью о составлении карт коллекций и их заказе. и была фраза:
Не следует использовать его с SortedSets, чтобы избежать дополнительной сортировки уже заказанные сущности.
Я не мог понять это утверждение. для меня это было неясно. что это за дополнительная сортировка?
и я также видел много примеров по этой проблеме, и ни один из них не использует @OrderBy
с SortedSet. и все они пытались использовать SortedSet
с @SortNatural
и @Sort
.
Почему никто не использует @OrderBy
с SortedSet
?
однако я видел много примеров, в которых @OrderBy
используется с SortedMap
? в чем разница между этими двумя (SortedSet
и SortedMap
), когда мы пытаемся использовать @OrderBy
?
К вашему сведению, SortedSet имеет подинтерфейс NavigableSet в Java 6+ и суперинтерфейсы SequencedSet и SequencedCollection в Java 21+. Тот же совет применим.
@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
и очень немногих других, чьи документы явно указывают, что они сохраняют порядок вставки).
«что это за дополнительная сортировка» Я думаю, это просто говорит о том, что у вас есть 1) сортировка записей, полученных из БД, с помощью
ORDER BY
и 2) сортировка с помощьюSortedSet
; и вам не нужно делать и то, и другое.