Mongodb 如果我使用RestFul服务,如何利用Spring存储库?

Mongodb 如果我使用RestFul服务,如何利用Spring存储库?,mongodb,spring-boot,spring-data,microservices,restful-architecture,Mongodb,Spring Boot,Spring Data,Microservices,Restful Architecture,我目前正在从事一个使用面向微服务架构的项目。我正在使用SpringBoot+MongoDB存储库,这样我们的团队就不必编写查询,从而节省了一些时间 我们面临着这种方法的问题。如果我们有实体用户: { "name":"Josh", "lastname":"Smith" "createdOn":"2018-01-01 00:00:00" } 我们希望将此实体作为资源公开,但我们不知道客户端将使用哪些参数来搜索此存储库,因此我们最终将得到如下结果: @GetMapping publ

我目前正在从事一个使用面向微服务架构的项目。我正在使用SpringBoot+MongoDB存储库,这样我们的团队就不必编写查询,从而节省了一些时间

我们面临着这种方法的问题。如果我们有实体用户:

{
"name":"Josh",
"lastname":"Smith"
"createdOn":"2018-01-01 00:00:00"
} 
我们希望将此实体作为资源公开,但我们不知道客户端将使用哪些参数来搜索此存储库,因此我们最终将得到如下结果:

    @GetMapping
    public ResponseEntity<User>get(@RequestParam(value = "name") String name,
    @RequestParam(value = "name") String lastname){...}
@GetMapping
public ResponseEntityget(@RequestParam(value=“name”)字符串名,
@RequestParam(value=“name”)字符串lastname{…}
和存储库:

公共列表findByName(字符串名称);
公共列表findByLastName(字符串lastname);
…

我们必须在用户存储库中创建许多方法和条件,以使用它们根据客户的查询返回答案。当实体获得更多字段时,这个问题会增加

我知道spring支持,但如果我们需要按日期范围进行搜索,它将不起作用


即使我们不知道我们的服务接收到什么查询,有没有办法利用Spring存储库

有很多方法可以解决这个问题,但一个简单的方法是使用自定义的
QueryDTO
和下面的所有查询属性

public class QueryDTO {
    private String firstName;
    private String lastName;

    // Getters and Setters
}
在您的存储库中,您可以扩展

public interface UserRepository扩展了crudepository,QueryByExampleExecutor{…}
您的控制器方法应执行以下操作:

@Autowired
private UserRepository userRepository;

@GetMapping
public ResponseEntity<User> get(@RequestParam(value = "q") String query) {
    QueryDTO queryDto = new ObjectMapper().readValue(query, QueryDTO.class);

    // You can write a converter to convert QueryDTO to User Example  
    User user = new User();
    user.setFirstName(queryDto.getFirstName());
    user.setLastName(queryDto.getLastName());
    Example<User> example = Example.of(user);

    return new ResponseEntity<User>(userRepository.findOne(example), HttpStatus.OK);
}
@Autowired
私有用户存储库用户存储库;
@GetMapping
公共响应获取(@RequestParam(value=“q”)字符串查询){
QueryDTO QueryDTO=newObjectMapper().readValue(查询,QueryDTO.class);
//您可以编写一个转换器,将QueryDTO转换为用户示例
用户=新用户();
user.setFirstName(queryDto.getFirstName());
user.setLastName(queryDto.getLastName());
Example Example=Example.of(用户);
返回新的ResponseEntity(userRepository.findOne(示例),HttpStatus.OK);
}
现在,不管您有多少个新字段,您只需修改
QueryDTO
即可添加新字段并启用这些字段的搜索

更新


如果需要按范围或使用自定义值进行查询,可以在
用户存储库中扩展。但是顾名思义
QueryByExampleExecutor
只支持匹配值。

谢谢,但是如果用户有一个“创建日期”,我们想搜索在X和Y之间创建的用户,那么日期范围过滤器呢?据我所知,它只适用于这种文件的精确匹配,对吗?答案是根据您的问题给出的。问题的最佳解决方案是
querybyexampleeexecutor
,但它有不支持范围(日期、数字等)的限制。如果您想要范围,那么您需要查看querydsldpredicateexecutor。您是对的。我将完成我的问题,并检查QuerydslPredicateExecutor。谢谢
@Autowired
private UserRepository userRepository;

@GetMapping
public ResponseEntity<User> get(@RequestParam(value = "q") String query) {
    QueryDTO queryDto = new ObjectMapper().readValue(query, QueryDTO.class);

    // You can write a converter to convert QueryDTO to User Example  
    User user = new User();
    user.setFirstName(queryDto.getFirstName());
    user.setLastName(queryDto.getLastName());
    Example<User> example = Example.of(user);

    return new ResponseEntity<User>(userRepository.findOne(example), HttpStatus.OK);
}