Add optional query parameter using spring data mongodb repository

試著忘記壹切 提交于 2021-02-19 06:07:20

问题


I want to add optional query parameters using spring data mongodb.

Controller code:

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

Note: 'id' is mandatory field and action type and params are optional. I want to get data based on 'id' whether I pass action type/params or not. Currently, i am getting null pointer exception in 'ActionServiceImpl' as I am not passing params and action Type. 'Action Type' is enumeration.

Can someone help me to change ActionRepository @Query tag so, that I can get data based on id without passing actionType or params. e.g. if I pass action type then mongo query should give result based on 'id $or actionType'.


回答1:


You cannot achieve this using @Query. Other possible alternatives are

  1. Create two methods in Repository class. One which takes only id and other which takes id and other arguments. And in your service class, you can decide which one to call based on the data in hand. (Not Scalable)

  2. Use QueryDsl. With this you can create search criteria based on data you have dynamically. Some helpful links
    https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#core.extensions.querydsl
    http://www.baeldung.com/queries-in-spring-data-mongodb

  3. You can use Example. Here is the link for documentation.(This has some limitations)

In my personal experience using QueryDsl is the best way to tackle these cases and it can be easily extended for further changes in requirement.



来源:https://stackoverflow.com/questions/49936463/add-optional-query-parameter-using-spring-data-mongodb-repository

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!