我使用spring数据,我的DAO看起来像

public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllOrderByIdAsc();   // I want to use some thing like this
}

在上面的代码中,注释行显示了我的意图。spring Data能提供内置功能吗 用ASC/DESC查找按某列排序的所有记录?


当前回答

public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public List<StudentEntity> findAllByOrderByIdAsc();
}

上面的代码应该可以工作。我用的是类似的东西:

public List<Pilot> findTop10ByOrderByLevelDesc();

它返回最高级别的10行。

重要的是: 因为我被告知很容易忽略这个答案的关键点,这里有一点澄清:

findAllByOrderByIdAsc(); // don't miss "by"
       ^

其他回答

是的,你可以在Spring Data中使用查询方法进行排序。

例如:使用id字段的值按升序或降序排列。

代码:

  public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllByOrderByIdAsc();   
}

可选择的解决方案:

    @Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(orderByIdAsc());
    }
private Sort orderByIdAsc() {
    return new Sort(Sort.Direction.ASC, "id")
                .and(new Sort(Sort.Direction.ASC, "name"));
}
}

Spring Data Sorting:排序

结合以上所有答案,你可以用BaseEntity编写可重用的代码:

@Data
@NoArgsConstructor
@MappedSuperclass
public abstract class BaseEntity {

  @Transient
  public static final Sort SORT_BY_CREATED_AT_DESC = 
                        Sort.by(Sort.Direction.DESC, "createdAt");

  @Id
  private Long id;
  private LocalDateTime createdAt;
  private LocalDateTime updatedAt;

  @PrePersist
  void prePersist() {
    this.createdAt = LocalDateTime.now();
  }

  @PreUpdate
  void preUpdate() {
    this.updatedAt = LocalDateTime.now();
  }
}

DAO对象重载findAll方法——基本上,仍然使用findAll()

public interface StudentDAO extends CrudRepository<StudentEntity, Long> {

  Iterable<StudentEntity> findAll(Sort sort);

}

StudentEntity扩展了包含可重复字段的BaseEntity(也许你也想按ID排序)

@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
class StudentEntity extends BaseEntity {

  String firstName;
  String surname;

}

最后,SORT_BY_CREATED_AT_DESC的服务和用法,它可能不仅会在StudentService中使用。

@Service
class StudentService {

  @Autowired
  StudentDAO studentDao;

  Iterable<StudentEntity> findStudents() {
    return this.studentDao.findAll(SORT_BY_CREATED_AT_DESC);
  }
}

请查看Spring Data JPA -参考文档,第5.3节。查询方法,特别是在第5.3.2节。查询创建,见“表3”。方法名称中支持的关键字”(链接截至2019-05-03)。

我认为它确实有你需要的,和你说的一样的查询应该工作…

AFAIK,我认为这对于直接的方法命名查询是不可能的。不过,您可以使用Sort类来使用内置的排序机制。存储库有一个findAll(Sort)方法,您可以将Sort的实例传递给该方法。例如:

import org.springframework.data.domain.Sort;

@Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(sortByIdAsc());
    }

    private Sort sortByIdAsc() {
        return new Sort(Sort.Direction.ASC, "id");
    }
} 

简单的方法:

repository.findAll(Sort.by(Sort.Direction.DESC, "colName"));

来源:https://www.baeldung.com/spring-data-sorting