更改Spring Data的findAll()方法的默认排序顺序。

25

我正在使用Spring Data JPA,想知道是否可以更改实体在Spring Data的findAll()方法中的默认排序顺序?


编写你自己的 JPA 查询。 - V G
1
@Andrei 是的,但如果可能的话,我想避免那种情况。 - Marcel Overdijk
findAll方法没有任何排序应用。如果您想要更改此设置,您需要扩展SimpleJpaRepository并覆盖findAll方法。请参阅向所有存储库添加自定义行为部分。您也可以使用此方法来覆盖默认行为。 - M. Deinum
4个回答

38
您可以按照以下方式实现:
dao.findAll(new Sort(Sort.Direction.DESC, "colName"));
// or
dao.findAll(Sort.by("colName").descending());

另一种实现相同效果的方法。使用以下方法名称:

findByOrderByIdAsc()

是的,这是一个选项。但是我希望标准的findAll()方法使用特定的顺序。原因是我也在它上面使用了@Cacheable。 - Marcel Overdijk
请尝试使用此方法名称 - findByOrderByIdAsc() - Mithun
2
它只为单个方法提供所需功能。 - SingleShot
你好。签名“findByOrderByIdAsc”正确吗?它是否选择按Id排序的所有记录?看起来第一个By后面似乎缺少一些东西。 - Andrey M. Stepanov
实际上这件事可以用很多种方式实现,这让人感到沮丧:HQL、findAll(Sort)、通过在方法名中添加OrderBy、实现PageableAndSortable...... 那么哪种更好? - Andrey M. Stepanov
显示剩余2条评论

7

您可以通过以下两种方式之一来完成此操作:

在spring-data 1.5+中,通过重写接口中的findAll()方法,在实体类中添加@Query注释并创建一个命名查询,例如下面的方式:

实体类

@Entity
@NamedQuery(name = "User.findAll", query="select u from User u order by u.address.town")
public class User{

}

仓库

public interface UserRepository extends ... <User, Long> {

    @Override
    @Query
    public Iterable<User> findAll();
}

或者,通过创建自定义存储库实现:

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations


2
请使用PagingAndSortingRepository替代。 这样,您就可以添加查询参数?sort=, 存储库:
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
  //no custom code needed
}

GET请求:

localhost:8080/users?sort=name,desc

-1
如果您想将自定义查询添加到findAll() jpa查询中,可以按照以下方式操作:
这里我更改了默认顺序。
根据我的默认顺序,主键是id。
但现在我在此设置id_order以更改默认顺序。 模型类
@Entity
@Table(name = "category")
@NamedQuery(name = "Category.findAll", query="select u from Category u order by 
u.id_order")
public class Category {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String nameEn;
private String nameSi;
private String nameTa;
private Integer id_order;

仓储类

import com.model.Category;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface CategoryRepository extends CrudRepository<Category, Integer> {

@Override
@Query
public Iterable<Category> findAll();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接