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.