我想使用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'给出结果。
答案 0 :(得分:0)
使用@Query
无法实现此目的。其他可能的替代方案是
在Repository类中创建两个方法。一个只接受id而另一个接受id和其他参数。在您的服务类中,您可以根据手头的数据决定调用哪一个。 (不可扩展)
使用QueryDsl。有了这个,您可以根据动态数据创建搜索条件。一些有用的链接
https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#core.extensions.querydsl
http://www.baeldung.com/queries-in-spring-data-mongodb
Example
。 Here是文档的链接。(这有一些限制) 根据我使用QueryDsl的个人经验是解决这些案例的最佳方法,可以轻松扩展以满足需求的进一步变化。