我在Spring排序时遇到问题。我有一个枚举类
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);
}
}
电影实体:
@Entity
@Table
public class Movie {
...
private Category category;
private Timestamp realizationDate;
....
}
现在我有一个可以返回电影列表的休息端点。我想按以下顺序对该列表进行排序:应该首先显示它们属于THRILLER的电影。如果两部电影属于同一类别,则应按实现日期进行排序。
@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)})
但这只能按字母顺序对枚举进行排序。
我需要一种可能性来做类似的事情:Sort.by(Category.THRILLER.contains(movie.getCategory())) 我有可能通过Pageable实现这一目标,还是应该以其他方式实现?
谢谢
答案 0 :(得分:3)
Spring Data直接仅支持按简单属性进行排序。
因此,要使其正常工作,您需要提供一个isThriller
属性。
您可以使用以下方法对现有对象结构进行操作:
a)一个触发器,用于填充数据库中的列
b)使用视图来计算所需的值
c)如果您使用的是Hibernate,则可以使用@Formula
注释来指示它计算值。
在任何一种情况下,您都在字符串或数据库中对构成惊悚片的类别进行硬编码。
如果您不希望将Category
设置为具有isThriller
属性的实体,然后可以按照通常的方式对其进行查询和排序。
答案 1 :(得分:0)
AFAIK Sort
仅对lexicographical order中的字段进行排序(与SQL中的相同,除非您使用SQL的程序版本,如PSQL),因此您不能引入一些自定义的排序逻辑。
您有两个选择: