是否可以向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注释或类似内容)。
答案 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”)