SpringData에서 OrderAll을 findAll과 함께 사용하는 방법


288

스프링 데이터를 사용하고 있으며 DAO는 다음과 같습니다.

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

위의 코드에서 주석 처리 된 줄은 내 의도를 보여줍니다. Spring Data는 ASC / DESC를 사용하여 일부 열의 모든 레코드 순서를 찾기 위해 이러한 방법을 사용하는 내장 기능을 제공 할 수 있습니까?

답변:


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

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

public List<Pilot> findTop10ByOrderByLevelDesc();

가장 높은 레벨의 10 행을 리턴합니다.

중요 : 이 답변의 요점을 놓치기 쉽다는 말을 들었으므로 여기에 약간의 설명이 있습니다.

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

4
메소드 서명이 Spring Data JPA에서 의도 한대로 작동하려면 "all"키워드를 포함시켜야합니다 List<StudentEntity> findAllByOrderByIdAsc();. 리턴 타입을 추가하고 여분의 공용 수정자를 제거하는 것도 좋은 생각입니다.)
— Håvard Geithus

1
공개는 중복 적이지만 다른 사람이 귀하의 코드에서 작업해야 할 경우를 대비하여 명확하게 유지합니다. PI가 작성자 코드에서 메소드 이름 이외의 다른 것을 변경하지 않았으며 문제가있는 곳이 아니기 때문에 누군가가 있어야 할 것을 모르는 경우 새로운 것을 배우기를 바랍니다. 게다가, 아래의 예에서 그들은 신을 찾을 필요가 없지만 어디를 고집하면 그렇게해야합니다 :) 'all'키워드를 추가했습니다. 감사.
— Sikor

73
키워드 By앞 의 작은 부분 OrderBy이 모든 차이를 만듭니다.
— Stefan Haberl

5
여전히 By앞에 추가 항목을 추가해야하는 이유를 이해하지 못합니다 OrderBy. 문서는 그것에 대해 얘기하지 않습니다 .
— Xtreme Biker

3
@XtremeBiker 제공 한 설명서 링크에서 "그러나 첫 번째 By는 실제 기준의 시작을 나타내는 구분 기호로 사용됩니다." 또한 "3.4.5. 쿼리 결과 제한"섹션으로 스크롤하면 실제로 이와 같은 예제가 있지만 설명하지는 않습니다.
— Sikor

54

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

이것은 Sikor의 답변 아래에 언급 된 대로 findAllByOrderByIdAsc ()를 사용하여 실제로 가능 합니다 ... @ 정답 이어야하는 @Prashant
— Samuel Parsonage

리포지토리를 덜 복잡하게 유지하려는 경우 서비스 계층에서 정렬을 수행하는 다른 방법입니다. 그래도 결과 크기를 명심하십시오!
— dkanejs

2
이 findAll()유형 의 메소드 CrudRepository<>는 인수 (정렬)에 적용 할 수 없습니다.
— Thiago Pereira

5
JpaRepository<>위의 예제를 사용하려면 @ThiagoPereira를 확장 해야합니다.
— Waleed Abdalmajeed '17 년

15

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

나는 그것이 당신이 필요로하는 것과 정확히 당신이 언급 한 것과 같은 쿼리를 가지고 있다고 생각합니다 ...


1
귀하의 링크는하지 작업 않습니다 -> 나는 당신이이 링크를 향해 지점으로 원 가정 docs.spring.io/spring-data/jpa/docs/current/reference/html/...
— 요르겐 SKAR 피셔


3

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

스프링 데이터 정렬 : 정렬


3

이 예제에서는 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);
        }
}

0

위의 모든 답변을 결합하여 재사용 가능한 코드를 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);

}

StudentEntityBaseEntity반복 가능한 필드를 포함하는 확장 (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);
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.