@OrderBy 和 SortedSet:为什么必须避免它?

问题描述 投票:0回答:1

我正在阅读一篇关于映射集合和排序它们的文章。还有一句话:

你不应该将它与 SortedSets 一起使用,以避免额外的排序 已订购的实体。

我无法理解这个说法。这对我来说很模糊。额外的排序是什么?

我也看到了很多关于这个问题的例子,但没有一个使用

@OrderBy
SortedSet
。他们所有人都尝试将
SortedSet
@SortNatural
@Sort
一起使用。

为什么没有人将

@OrderBy
SortedSet
一起使用?

但是,我看到很多使用

@OrderBy
SortedMap
的例子?当我们尝试使用
SortedSet
时,这两个(
SortedMap
@OrderBy
)有什么区别?

java hibernate jpa collections spring-data-jpa
1个回答
0
投票

@OrderBy
会导致生成的 SQL 中出现
ORDER BY
子句。
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);

上面任意打印“Hello”,然后“World”或“World”,然后“Hello”(顺序取决于哈希码,这是一个不相关的细节。因此,“任意”这个词 - 它不是随机 - 你可以”不要依赖它的不同,并且在任何需要随机性的地方绝对不应该依赖它,因此它有一个顺序,但该顺序没有任何意义(它是任意的)。此外,交换第 1 行和第 2 行对此代码的输出没有影响。 大多数集合都是这样工作的(你放入东西的顺序与结果无关;只有你放入的

什么

,而不是你放入它们的以什么顺序)。具体来说,allSortedSets 以这种方式工作,因为根据定义,排序集将始终保持其内容排序,这意味着您将元素放入其中的顺序是无关紧要的。 而且,事情是这样的:如果你要求你的数据库花时间对事物进行排序,然后你获取结果并将元素推入一个集合中,忽略你给它元素的顺序,那是..愚蠢的。毫无意义地浪费时间。因此,对于大多数集合来说,使用

@OrderBy

是一件愚蠢的事情,对于 all

SortedSets
来说也是一件愚蠢的事情。 java 中唯一有用的常用集合是 LinkedHashSet,它被显式定义为维护将元素放入其中的顺序。即使
HashSet
不是
SortedSet
,使用
@OrderBy
然后将元素放入
HashSet
“有效”并且很愚蠢。
@OrderBy
部分除了浪费数据库资源之外没有任何影响。对于任何
SortedSet
都是一样,对于几乎所有其他实现 Set 的东西也一样(除了
LinkedHashSet
和极少数其他其文档明确表明它们保留插入顺序的东西)。
    

© www.soinside.com 2019 - 2024. All rights reserved.