【问题标题】:Add optional query parameter using spring data mongodb repository使用 spring data mongodb 存储库添加可选查询参数
【发布时间】:2018-04-20 07:36:09
【问题描述】:

我想使用 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”是必填字段,动作类型和参数是可选的。无论我是否传递动作类型/参数,我都想根据“id”获取数据。目前,我在“ActionServiceImpl”中收到空指针异常,因为我没有传递参数和操作类型。 “动作类型”是枚举。

有人可以帮我更改 ActionRepository @Query 标记,以便我可以根据 id 获取数据,而无需传递 actionType 或参数。例如如果我传递动作类型,那么 mongo 查询应该根据 'id $or actionType' 给出结果。

【问题讨论】:

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


    【解决方案1】:

    您无法使用@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. 您可以使用Example。 Here 是文档的链接。(这有一些限制)

    根据我的个人经验,使用 QueryDsl 是解决这些情况的最佳方式,并且可以轻松扩展以适应进一步的需求变化。

    【讨论】:

    • 谢谢@pvpkiran。您能否给我看一个示例,如何使用 QueryDsl 进行上述修改?
    • 我建议您在这些链接的帮助下阅读 Querydsl 并尝试一下。如果您遇到困难,很乐意提供帮助
    猜你喜欢
    • 2015-07-19
    • 2020-01-08
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2014-09-22
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多