问题
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
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)
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- 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