使用spring data mongodb repository添加可选的查询参数

时间:2018-04-20 07:36:10

标签: java spring mongodb spring-data spring-data-jpa

我想使用spring data mongodb添加可选的查询参数。

控制器代码:

@RestController
private final ActionService actionService;


@RequestMapping(value = "/action/{id}", method = RequestMethod.GET)
public ResponseEntity<List<Action>> getActionList(@PathVariable("id") long id,
            @RequestParam(value = "actionType", required = false) ActionType actionType,
            @RequestParam(value = " ", required = false) String[] params) {

        List<Action> actionList = actionService.getAction(id, actionType, params);
        return new ResponseEntity<>(actionList, HttpStatus.OK);
}

ActionServiceImpl.java

private ActionRepository actionRepository;

public List<Action> getAction(long id, ActionType type, String... var1) {
    return actionRepository.getByActionType(id, type, var1.length > 0 ? var1[0] : "", var1.length > 1 ? var1[1] : "", var1.length > 2 ? var1[2] : "");
}

ActionRepository.java

@Repository
public interface ActionRepository extends MongoRepository<Action, String> {

    @Query(value = "{ 'id' : ?0  , 'actionType' : ?1 ,  'param1' : ?2 , 'param2': ?3 , 'param3' : ?4 } ")
    List<Action> getByActionType(long id, ActionType type, String var1, String var2, String var3);
}

注意:'id'是必填字段和操作类型,params是可选的。我想基于'id'获取数据,无论我是否传递动作类型/参数。目前,我在'ActionServiceImpl'中获得空指针异常,因为我没有传递params和action Type。 'Action Type'是枚举。

有人可以帮我改变ActionRepository @Query标签,这样我就可以在不传递actionType或params的情况下获取基于id的数据。例如如果我传递动作类型,那么mongo查询应该根据'id $或actionType'给出结果。

1 个答案:

答案 0 :(得分:0)

使用@Query无法实现此目的。其他可能的替代方案是

  1. 在Repository类中创建两个方法。一个只接受id而另一个接受id和其他参数。在您的服务类中,您可以根据手头的数据决定调用哪一个。 (不可扩展)

  2. 使用QueryDsl。有了这个,您可以根据动态数据创建搜索条件。一些有用的链接
    https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#core.extensions.querydsl
    http://www.baeldung.com/queries-in-spring-data-mongodb

  3. 您可以使用ExampleHere是文档的链接。(这有一些限制)
  4. 根据我使用QueryDsl的个人经验是解决这些案例的最佳方法,可以轻松扩展以满足需求的进一步变化。