哪种方法更适合基础和分选速度?

时间:2018-06-03 16:40:37

标签: java spring spring-mvc spring-boot jpa

我目前有一个清单

@OneToMany(mappedBy = "movie", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OrderBy("date ASC")
private List<MovieReleaseDateEntity> releaseDates = new ArrayList<>();

下载时的实体按日期排序。

但是,如您所知,List不是最适合JPA的,建议使用Set。这就是我有不同想法的原因

@OneToMany(mappedBy = "movie", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private SortedSet<MovieReleaseDateEntity> releaseDates = new TreeSet<>();

并实施Comparable

public int compareTo(MovieReleaseDateEntity o) {
    return this.date.compareTo(o.date);
}

哪种方式更好?第一个是List,第二个是Set

2 个答案:

答案 0 :(得分:1)

数据库旨在以优化的方式执行order by命令,同时对order by中使用的列进行索引。
因此,如果您可以调整表上的索引约束,那么您应该支持数据库的排序。

  

但是,如您所知,List不是最适合JPA和   建议使用Set。

我宁愿说您不能滥用实体中的List映射,因为可接受的数量因良好的理由(基数)而受到限制。

您还可以更简单地看到事情:如果您的元素很少,我认为在性能方面使用Set可能是一种可接受的方式。
否则,使用数据库完成List的{​​{1}}可能会受到青睐。

在任何情况下,使用对您的用例来说最合适的结构(order byList),然后在更改设计之前测量实际性能,以期获得更好的性能。

答案 1 :(得分:0)

第一种方法(@OrderBy("date ASC"))在数据库级别上排序,第二种方法在内存中使用java实现。如果返回的列表大小足够大,那么使用第一种方法会更好。

如果返回的集合相当小并且您需要一些复杂的排序逻辑(但不是按特定字段排序的情况),则使用SortedSet对实现Comparable的实体进行排序可能是合理的。