在CrudRepository上的默认排序?

时间:2018-07-18 15:43:30

标签: java spring hibernate spring-data

是否可以向CrudRepository方法添加默认排序?喜欢:

interface PersonRepository extends CrudRepository<Person, Long> {
   @SortDefault(sort = "lastname", direction = Sort.Direction.ASC) //this is invalid
   List<Person> findAllByAge(int age);
}

@Entity
public class Person {
    @Id long id;
    String firstname, lastname;
    int age;
}

findAllByAge(int age, Sort sort);相比,优点是不必每个调用类都提供Sort

(旁注:我知道我可以将类重命名为findAllByAgeSortLastnameAsc(),但是我明确地询问@SortDefault注释或类似内容)。

2 个答案:

答案 0 :(得分:2)

您可以在回购中使用以下技巧:

@Override
default Page<Person> findAll(Pageable pageable) {
    return findAllBy(applyDefaultOrder(pageable));
}

Page<Person> findAllBy(Pageable pageable);

default Pageable applyDefaultOrder(Pageable pageable) {
    if (pageable.getSort().isUnsorted()) {
        Sort defaultSort = Sort.by("lastname").ascending();
        pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), defaultSort);
    }
    return pageable;
}

例如,此技巧将实体的lastname字段的默认升序应用到findAll方法。

已更新

另一个不含Pageable作为参数的变体:

@Override
default List<Person> findAll() {
    return findAll(Sort.by(Sort.Direction.ASC, "lastname"));
}

或使用任意方法:

default List<Person> findAllByAge(int age) { 
    return findAllByAge(int age, Sort.by(Sort.Direction.ASC, "lastname"));
} 

List<Person> findAllByAge(int age, Sort sort);

答案 1 :(得分:0)

那将是一个非常酷的功能!
根据您的数据库,返回的订单可能不是what you expect™。例如,PostgreSQL似乎不是按PrimaryKey上的asc / desc排序,而是按lastModified排序。

现在,没有为代理/虚拟(定义的存储库接口)方法(findByXYZ)提供默认排序顺序的“间接”解决方案。

您唯一的选择是通过提供排序对象

明确指定它
Sort.by("id"); //default is ASC
Sort.by(Sort.Order.desc("id"));
Sort sort = Sort.by("id").descending();
repo.findAll(sort);

或在存储库界面中相应地命名自定义查询方法:

public interface YourEntityRepository extends JpaRepository<YourEntity, Long> {
        List<Entit> findAllByOrderById();
}

(请注意,即使没有给出“ where”子句,也要额外加上“ By”)