스프링 데이터를 사용하고 있으며 DAO는 다음과 같습니다.
public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
public findAllOrderByIdAsc(); // I want to use some thing like this
}
위의 코드에서 주석 처리 된 줄은 내 의도를 보여줍니다. Spring Data는 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
클래스를 사용하여 내장 정렬 메커니즘을 사용할 수 있습니다 . 저장소에는 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");
}
}
답변
Spring Data JPA-Reference Documentation 섹션 5.3을 살펴보십시오 . 쿼리 방법 , 특히 섹션 5.3.2. ” 표 3. 메소드 이름 내에서 지원되는 키워드 “의 쿼리 작성 (2019-05-03 현재 링크)
나는 그것이 당신이 필요로하는 것과 정확히 당신이 언급 한 것과 같은 쿼리를 가지고 있다고 생각합니다 …
답변
간단한 방법 :
repository.findAll(Sort.by(Sort.Direction.DESC, "colName"));
답변
예. 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"));
}
}
스프링 데이터 정렬 : 정렬
답변
이 예제에서는 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);
}
}