스프링 데이터 내의 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
'programing' 카테고리의 다른 글
| 서버 없이 React 응용 프로그램 실행 (0) | 2023.03.20 |
|---|---|
| WP: wp_enqueue_script에서 버전 번호를 삭제하려면 어떻게 해야 합니까? (0) | 2023.03.20 |
| IE 8 자동으로 닫힘IE 8 자동으로 닫힘태그 (0) | 2023.03.20 |
| Woocommerce 제품 가져오기 (0) | 2023.03.20 |
| 텍스트 영역의 트위터 스타일 자동 완성 (0) | 2023.03.20 |