如何在spring数据中使用orderby和findall

edqdpe6u  于 2021-07-24  发布在  Java
关注(0)|答案(7)|浏览(274)

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

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

在上面的代码中,注解行显示了我的意图。spring数据是否可以提供内置功能来使用这样一种方法来查找所有记录,并按asc/desc的某个列排序?

slmsl1lt

slmsl1lt1#

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

上面的代码应该有用。我用的是类似的东西:

public List<Pilot> findTop10ByOrderByLevelDesc();

它返回最高级别的10行。
重要提示:因为我被告知很容易错过这个答案的关键点,这里有一点澄清:

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

dpiehjr42#

好吧,我认为用直接方法命名查询是不可能的。但是,您可以使用内置的排序机制,使用 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");
    }
}
py49o6xq

py49o6xq3#

简单方法:

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

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

o4hqfura

o4hqfura4#

请看SpringDataJPA-参考文档,第5.3节。查询方法,特别是第5.3.2节。查询创建,在“表3。方法名称中支持的关键字”(链接从2019-05-03开始)。
我认为它正是你所需要的和你所说的相同的查询应该工作。。。

wgeznvg7

wgeznvg75#

是的,您可以使用spring数据中的查询方法进行排序。
例如:使用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数据排序:排序

2jcobegt

2jcobegt6#

在本例中,我尝试向您展示一个完整的示例来个性化排序

import java.util.List;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.*;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.data.domain.Sort;
 /**
 * Spring Data  repository for the User entity.
 */
 @SuppressWarnings("unused")
 @Repository
 public interface UserRepository extends JpaRepository<User, Long> {
 List <User> findAllWithCustomOrderBy(Sort sort);
 }

您将使用以下示例:动态生成排序示例的对象的方法:

import org.springframework.data.domain.Sort;
public class SampleOrderBySpring{
 Sort dynamicOrderBySort = createSort();
     public static void main( String[] args )
     {
       System.out.println("default sort \"firstName\",\"name\",\"age\",\"size\" ");
       Sort defaultSort = createStaticSort();
       System.out.println(userRepository.findAllWithCustomOrderBy(defaultSort ));

       String[] orderBySortedArray = {"name", "firstName"};
       System.out.println("default sort ,\"name\",\"firstName\" ");
       Sort dynamicSort = createDynamicSort(orderBySortedArray );
       System.out.println(userRepository.findAllWithCustomOrderBy(dynamicSort ));
      }
      public Sort createDynamicSort(String[] arrayOrdre) {
        return  Sort.by(arrayOrdre);
        }

   public Sort createStaticSort() {
        String[] arrayOrdre  ={"firstName","name","age","size");
        return  Sort.by(arrayOrdre);
        }
}
dxxyhpgq

dxxyhpgq7#

结合以上所有答案,您可以使用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 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);
  }
}

相关问题