programing

페이지 가능한 스프링 사용자 지정 쿼리

telebox 2023. 8. 25. 23:29
반응형

페이지 가능한 스프링 사용자 지정 쿼리

저는 봄 응용 프로그램에서 페이지화를 구현하고 싶습니다.저장소를 사용하여 페이지화를 구현할 수는 있지만 데이터 검색을 위해 자체 쿼리를 작성할 수는 없습니다. 저장소에 쿼리 클래스를 수락하는 방법이 없을 정도로 제한된 메서드가 있습니다.

mongodb에서 데이터를 검색하기 위해 사용자 지정 쿼리를 작성하려면 mongotemplate를 사용해야 합니다. mongotemplate에서는 페이지화를 구현할 수 없습니다.

db 쿼리와 함께 페이지화를 구현할 수 있는 다른 방법이 있습니까?아무나 나를 도와줄 수 있습니다.

당신이 알아냈듯이, MongoTemplate는 전체 페이지 추상화를 지원하지 않습니다.KneeLess가 말했듯이 당신은 그것을 사용할 수 있습니다.@Query- 일부 사용자 지정 쿼리를 수행하기 위한 주석입니다.

Spring Repository를 사용하는 것이 충분하지 않을 수 있습니다.PageableExecutionUtilsMongoTemplate와 함께 사용할 수 있습니다.

예를 들어 다음과 같습니다.

@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

반응형