春季分页与案例排序

时间:2019-09-17 17:02:09

标签: spring spring-boot spring-data-jpa spring-data

我在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实现这一目标,还是应该以其他方式实现?

谢谢

2 个答案:

答案 0 :(得分:3)

Spring Data直接仅支持按简单属性进行排序。 因此,要使其正常工作,您需要提供一个isThriller属性。

您可以使用以下方法对现有对象结构进行操作:

a)一个触发器,用于填充数据库中的列

b)使用视图来计算所需的值

c)如果您使用的是Hibernate,则可以使用@Formula注释来指示它计算值。

在任何一种情况下,您都在字符串或数据库中对构成惊悚片的类别进行硬编码。

如果您不希望将Category设置为具有isThriller属性的实体,然后可以按照通常的方式对其进行查询和排序。

答案 1 :(得分:0)

春季分页中的

AFAIK Sort仅对lexicographical order中的字段进行排序(与SQL中的相同,除非您使用SQL的程序版本,如PSQL),因此您不能引入一些自定义的排序逻辑。

您有两个选择:

  • 将自定义过程/函数引入数据库并从代码中调用它(丑陋和错误的方法)
  • 从数据库中获取电影后,通过使用lambda和自定义比较器对电影列表进行排序(干净且更简单的方法)