페이지 가능한 스프링 사용자 지정 쿼리
저는 봄 응용 프로그램에서 페이지화를 구현하고 싶습니다.저장소를 사용하여 페이지화를 구현할 수는 있지만 데이터 검색을 위해 자체 쿼리를 작성할 수는 없습니다. 저장소에 쿼리 클래스를 수락하는 방법이 없을 정도로 제한된 메서드가 있습니다.
mongodb에서 데이터를 검색하기 위해 사용자 지정 쿼리를 작성하려면 mongotemplate를 사용해야 합니다. mongotemplate에서는 페이지화를 구현할 수 없습니다.
db 쿼리와 함께 페이지화를 구현할 수 있는 다른 방법이 있습니까?아무나 나를 도와줄 수 있습니다.
당신이 알아냈듯이, MongoTemplate는 전체 페이지 추상화를 지원하지 않습니다.KneeLess가 말했듯이 당신은 그것을 사용할 수 있습니다.@Query
- 일부 사용자 지정 쿼리를 수행하기 위한 주석입니다.
Spring Repository를 사용하는 것이 충분하지 않을 수 있습니다.PageableExecutionUtils
MongoTemplate와 함께 사용할 수 있습니다.
예를 들어 다음과 같습니다.
@Override
public Page<XXX> findSophisticatedXXX(/* params, ... */ @NotNull Pageable pageable) {
Query query = query(
where("...")
// ... sophisticated query ...
).with(pageable);
List<XXX> list = mongoOperations.find(query, XXX.class);
return PageableExecutionUtils.getPage(list, pageable,
() -> mongoOperations.count((Query.of(query).limit(-1).skip(-1), XXX.class));
}
Spring Repository도 마찬가지입니다.여기 보시는 것처럼 두 개의 쿼리도 실행됩니다.
Spring's를 사용하여 쿼리를 정의한 다음Pageable
마지막 매개 변수로 사용:
public interface FooRepository extends MongoRepository<Foo,String> {
@Query(value="{'name': ?0}")
Page<Foo> findByMethod(String name, Pageable pageable);
}
그런 다음 다음과 같이 사용합니다.
Page<Foo> fooPage = fooRepository.findByMethod("John", new PageRequest(0,20));
누군가가 필요로 할 때를 대비해서 밖으로 내보내는 겁니다.
SpringData에는 사용자 지정 쿼리 방법이 있습니다.
final Pageable pageableRequest = new PageRequest(0, 2);
Query query = new Query();
query.with(pageableRequest);
Spring Data PagingAndSortingRepository 인터페이스를 확장하면 저장, 찾기, 모두 찾기 및 삭제와 같은 몇 가지 일반적인 방법을 사용할 수 있으며 사용자 지정 쿼리를 추가할 수도 있습니다.
public interface Repository extends PagingAndSortingRepository<Book, ID extends Serializable> {
// Common method
Page<Book> findAll(Pageable pageable);
// Custom query based on Spring Data naming convention
Page<Book> findByNameOrDescription(String name, String description, Pageable pageable);
}
다음은 메모리의 모든 데이터를 로드하지 않은 예입니다.
@Autowired
private MongoTemplate mongoTemplate;
@Override
public Page<YourClass> findAll(/* params, ... */ @NotNull Pageable pageable) {
Query query = query(
where("...")
// ... your query ...
).with(pageable);
Long totalCount = mongoTemplate.count(query, YourClass.class);
List<YourClass> results = mongoTemplate.find(query.with(pageable), YourClass.class);
Page<YourClass> resultsWithPage = PageableExecutionUtils.getPage(results, pageable, () -> totalCount);
return resultsWithPage;
}
pagination을 위한 inbuild 메서드를 포함하는 PagingAndSortingRespository를 사용하여 jpa와 함께 springboot을 사용하여 pagination을 구현하는 방법에 대한 코드 스니펫을 제공합니다.
public interface PersonRepository extends PagingAndSortingRepository<Person, Integer> {
}
@Service
public class PersonServiceImpl implements PersonService{
@Autowired
private PersonRepository personRepository;
public Page<Person> listAll(int pageNumber){
if(pageNumber>0){
Pageable pageWithTenElements = PageRequest.of(pageNumber-1,10);
//first param decide page and second param decide no of record
return personRepository.findAll(pageWithTenElements);}
else
return null;
}
}
@RestController
public class AppController {
@Autowired
private PersonService personService;
@GetMapping("/page/{pageNumber}")
public ResponseEntity<List<Person>> getPersons(@PathVariable("pageNumber") pageNumber){
List<Person> persons = personService.listAll(pageNumber).getContent();
ResponseEntity<SkillsTierResponse> response =
new ResponseEntity<List<Person>>(persons,HttpStatus.OK);
return response;
}
}
Pageable pageableBase = PageRequest.of(0, request.getSize());
List <User> users = userRepository.findAllSignUpComplete(true, pageableBase);
공용 인터페이스 UserRepository에서 PagingAndSortingRepository <사용자, 문자열> {...
언급URL : https://stackoverflow.com/questions/27296533/spring-custom-query-with-pageable
'programing' 카테고리의 다른 글
jQuery를 사용하여 종료 날짜가 시작 날짜보다 큰지 확인 (0) | 2023.08.25 |
---|---|
Swift에서 배경을 흐리게 하는 방법이 있습니까?UI? (0) | 2023.08.25 |
Oracle은 두 테이블이 모두 큰 경우에도 항상 HASH JOIN을 사용합니까? (0) | 2023.08.25 |
Powershell - 프로세스가 실행되고 있지 않으면 프로세스를 시작합니다. (0) | 2023.08.25 |
php 자동 증분이 9 또는 10000에서 중지됩니다. (0) | 2023.08.25 |