java - CrudRepository 上的默认排序?

标签 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 注释或类似内容)。

最佳答案

您可以在存储库中使用以下技巧:

@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);

关于java - CrudRepository 上的默认排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406088/

相关文章:

java - @NumberFormat接受逗号和点,如何在InitBinder中实现这一点

java - BeanCreationException 和 NoClassDefFoundError : What am I missing in here?

java - JpaRepository findAll() 正在获取嵌套对象

java - hibernate配置文件和SessionFactory

java - 使用 HttpClient 发布到表单但获取 SSLPeerUnverifiedException 但浏览器工作正常

java - Java中的JSON反序列化错误

java - 如何从 Hibernate 运行 SEQUENCE setVal

java - 实体映射中序列的增量大小设置为[50],而关联的数据库序列增量大小为[1]

java - 为什么我们需要双向同步方法?

java - 使用 Nashorn 查找 JMX MBean