具有可分页的Spring自定义查询

时间:2014-12-04 14:29:37

标签: spring mongodb spring-data spring-boot spring-data-mongodb

我想在spring应用程序中实现分页。我知道使用存储库我们可以实现分页但我们不能编写自己的数据检索查询存储库中有限的方法也没有接受查询类的方法。

如果我们要编写自定义查询以从mongodb检索数据,我们必须使用mongotemaplete,因为我知道使用mongotemplate我们无法实现分页。

还有其他方法可以实现分页以及数据库查询。 任何人都可以帮助我。

6 个答案:

答案 0 :(得分:18)

正如您所知,MongoTemplate不支持完整的页面抽象。就像KneeLess所说,你可以使用@Query - Annotation来做一些自定义查询。

如果这还不够,可以使用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, XXX.class));
}

Spring存储库也在做同样的事情。正如您所见here,它们也会触发两个查询。

答案 1 :(得分:4)

使用MongoRepository。 将MongoRepository扩展为

public interface FooRepository extends MongoRepository<Foo,String> {    
    @Query(value="{'name': ?0}");
    Page<Foo> findByMethod(String name, Pageable pageable);
}

然后,将其用作

Page fooPage = FooRepository.findByMethod('John', new PageRequest(0,20));

答案 2 :(得分:4)

只是把它拿出来以防有人需要它。

SpringData有一个自定义查询方法:

final Pageable pageableRequest = new PageRequest(0, 2);
Query query = new Query();
query.with(pageableRequest);

答案 3 :(得分:2)

通过扩展Sp​​ring Data PagingAndSortingRepository界面,您可以获得一些常用方法,例如save,find,findAll和delete,还可以添加自己的自定义查询:

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);

}

答案 4 :(得分:0)

我提供了一个代码片段,介绍了如何使用jstrong使用包含内置分页方法的 PagingAndSortingRepository 使用springboot和jpa来实现分页。

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;
   }

  }

答案 5 :(得分:0)

Pageable pageableBase = PageRequest.of(0, request.getSize());
List <User> users = userRepository.findAllSignUpComplete(true, pageableBase);

公共接口UserRepository扩展了PagingAndSortingRepository {...