programing

스프링 데이터 내의 FindAll과 함께 OrderBy를 사용하는 방법

javajsp 2023. 3. 20. 21:27

스프링 데이터 내의 FindAll과 함께 OrderBy를 사용하는 방법

스프링 데이터를 사용하고 있는데 DAO는

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

위 코드에서 코멘트 행은 나의 의도를 나타냅니다.스프링 데이터는 ASC/DESC를 사용하여 일부 열별로 모든 레코드 순서를 찾는 방법을 사용할 수 있는 내장 기능을 제공할 수 있습니까?

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

위의 코드가 동작합니다.비슷한 것을 사용하고 있습니다.

public List<Pilot> findTop10ByOrderByLevelDesc();

가장 높은 수준의 행이 10개 반환됩니다.

중요: 이 답변의 요점을 놓치기 쉽다는 말을 들었기 때문에, 다음과 같이 간단히 설명하겠습니다.

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

AFAIK, 직접 메서드 명명 쿼리로는 불가능할 것 같습니다.그러나 클래스를 사용하여 기본 제공 정렬 메커니즘을 사용할 수 있습니다.저장소에는 다음 인스턴스를 전달할 수 있는 메서드가 있습니다.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

Spring Data JPA - Reference Documentation, 섹션 5.3을 참조하십시오. 쿼리 방법, 특히 섹션 5.3.2. "표 3"의 "쿼리 작성" 메서드 이름 내에서 지원되는 키워드"(2019-05-03년 기준 링크)

당신이 필요로 하는 것이 바로 그것이고, 당신이 말한 것과 같은 질문이 효과가 있을 것이라고 생각합니다.

예, 스프링 데이터의 쿼리 방법을 사용하여 정렬할 수 있습니다.

예: 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"));
}
}

스프링 데이터 정렬:정렬

이 예에서는 OrderBy 정렬을 개인화하는 완전한 예를 보여드리고자 합니다.

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

다음 예제를 사용합니다.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);
        }
}

위의 모든 답변을 조합하여 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);
  }
}

언급URL : https://stackoverflow.com/questions/25486583/how-to-use-orderby-with-findall-in-spring-data