Spring分页与案例排序
我对春天的分类有问题。我有一个枚举类Spring分页与案例排序,spring,spring-boot,spring-data-jpa,spring-data,Spring,Spring Boot,Spring Data Jpa,Spring Data,我对春天的分类有问题。我有一个枚举类 public enum Category { A, B, C, D, E, F; private static final List<Category> THRILLER; static { THRILLER = Arrays.asList(A, F, D); } private static final List<Category> DRA
public enum Category {
A,
B,
C,
D,
E,
F;
private static final List<Category> THRILLER;
static {
THRILLER = Arrays.asList(A, F, D);
}
private static final List<Category> DRAMA;
static {
DRAMA = Arrays.asList(C, E, B);
}
}
现在我有了一个返回电影列表的rest端点。我想按照以下顺序对这个列表进行排序:它们属于THRILLER的电影应该首先显示。如果两部电影属于同一类别,则应按实现日期进行排序
@GetMapping(value = "/movies")
public ResponseEntity<PagedResources<Movie>> list(@PageableDefault() Pageable pageable) {
.......
}
但这种排序只能按字母顺序排列枚举
我需要一种可能性来执行类似的操作:
Sort.by(Category.THRILLER.contains(movie.getCategory())
。我有可能通过Pageable实现这一点,或者我应该用另一种方式实现这一点 AFAIKSort
在spring中,分页仅在中对字段进行排序(与SQL中相同,除非您使用某些SQL过程版本,如PSQL),因此无法引入一些自定义排序逻辑
您有两个选择:
- 在数据库中引入自定义过程/函数,并从代码中调用它(丑陋和糟糕的方法)
- 从DB获取电影列表后,通过播放lambdas和自定义比较器对电影列表进行排序(干净且更简单的方法)
isThriller
属性
可以使用以下方法对现有对象结构执行此操作:
a) 用于填充数据库中列的触发器
b) 使用视图计算所需的值
c) 如果使用Hibernate,可以使用@Formula
注释来指示它计算值
在这两种情况下,您都是在字符串或数据库中硬编码构成惊悚片的类别
如果您不想让
Category
成为一个具有isThriller
属性的实体,然后您可以按照通常的方式进行查询和排序。对我来说,您的代码毫无意义,您有表示类别类型的enum,以及作为类别名称的字段名,这是列表和聚合其他类别?重点在哪里?我有一个包含字段类别的电影实体。如前所述,当类别相同时,我想按类别和实现日期对电影进行排序。我认为第二个建议不起作用,因为我正在使用分页。是的,但你们有自己的端点,在那个里你们可以引入自定义的排序逻辑。然后我必须得到所有的电影,然后排序,然后创建页面,这将是如此沉重,因为我们有很多电影。排序必须在数据库层中进行。我通过使用添加了isThriller属性的数据库视图解决了这个问题。非常感谢。
@GetMapping(value = "/movies")
public ResponseEntity<PagedResources<Movie>> list(@PageableDefault() Pageable pageable) {
.......
}
@SortDefault.SortDefaults({SortDefault(sort="category", direction=Sort.Direction.ASC), SortDefault(sort="realizationDate", direction=Sort.Direction.ASC)})