我正尝试在spring创建一个GETendpoint,带有多个可选的请求参数,以便从mongo(思考和查询)查询数据并返回。
我目前所拥有的-MyController.java
@GetMapping
public ResponseEntity<Iterable<Item>> searchItem(@RequestParam Map<String, Optional<String>> requestParams){
List<Item> items = itemService.findItem(requestParams);
return (new ResponseEntity<>(Item, HttpStatus.Ok));
}
@GetMapping
public ResponseEntity<Iterable<Item>> getAllItems(){
Iterable<Item> items= itemService.listItems();
return (new ResponseEntity<>(items, HttpStatus.OK));
}
这是我的服务层-
@Override
public List<Item> findItem(Map<String,Optional<String>> params) {
QItem qItem = QItem.item;
BooleanBuilder builder = new BooleanBuilder();
params.forEach( (String key, Optional<String> value) -> {
if(value.isPresent()) {
builder.and(qUser.key.eq(value.get()));
}
});
List<Item> items = itemRepository.findAll(builder);
return resultItems;
}
@Override
public Iterable<Item> listItems() {
List<Item> items = userRepository.findAll();
return items;
}
如果还不是很明显的话,我会努力使用booleanBuilder构建谓词并将其传递给存储库层。映射中的键将包含QItems required字段名的名称。
另外,如何解析GET all users和GET by参数的2个GET映射?我可以使用GET请求->/Item来检索所有项,也可以使用参数GET请求来查询参数->/Item?param1=value1¶m2=value2
对于您的第一个问题,您可以使用expression.stringPath()方法从根对象获取参数的完整路径,
@Override
public List<Item> findItem(Map<String,Optional<String>> params) {
QItem qItem = QItem.item;
BooleanBuilder builder = new BooleanBuilder();
params.forEach( (String key, Optional<String> value) -> {
if(value.isPresent()) {
StringPath column = Expressions.stringPath(qItem, key);
builder.and(column.eq(value));
}
});
List<Item> items = itemRepository.findAll(builder);
return resultItems;
}
对于您的第二个说明,它基于您的选择,但您可以在单个GetMapping中同时完成这两个操作,方法是添加一些条件来检查您的参数映射是否为空,
如果为空->调用ItemRepository.findAll(),
else->调用ItemRepository.findAll(生成器)
因此,为了提供搜索功能,我可以进行多个连接。我开始使用带有@query表示法的JPQL,但我必须对每个参数进行检查,结果一团糟。我开始研究其他选项,我看到了关于QueryDSL、标准和规范的东西,但我不确定我应该关注和学习哪一个。不幸的是,我不知道很多关于这个主题,我希望有人能指出我在正确的方向,以一个很好的实现这个搜索。谢谢!
问题内容: 我想为一组SQL查询创建一个过滤器,以便用户最多可以通过三个值过滤SQL SELECT。用户界面具有三个文本框,每个文本框都将绑定到SQL表中的列名。用户可以通过这些文本框提供一个,两个或三个条件。 到目前为止,这就是我所拥有的。我知道这些声明将不起作用,但是我找不到解决该问题的方法。(使用不会返回任何结果。 问题答案: 如果我正确遵循,您想根据所有填充变量过滤结果,以处理未填充变量,
问题内容: 我有一个源输入 input.txt 我想将这些输入馈入程序,如下所示: 所以我尝试使用 xargs ,但是没有运气。 它给 但我想要 任何的想法? 问题答案: 到目前为止给出的解决方案都无法正确处理包含空格的文件名。如果文件名包含“或”,有些甚至会失败。如果输入文件是由用户生成的,则应该准备好使用令人惊讶的文件名。 GNU Parallel 很好地处理了这些文件名,并为您(至少)提供了
但它匹配和路径没有
问题内容: 我需要制作一个使用JPA Criteria API和多个参数的搜索方法。现在的问题是,并非每个参数都是必需的。因此某些可能为null,因此不应将其包含在查询中。我已经使用CriteriaBuilder进行了尝试,但看不到如何使其工作。 使用Hibernate Criteria API,这相当容易。只需创建条件,然后添加限制。 如何使用JPA的Criteria API达到相同的目的? 问
团队 我想使用Powermock私有空方法来模拟下面的方法ToMock(int参数1、字符串参数2、int参数3){} 我在下面尝试了一个不起作用的示例类spyObject=PowerMockito。spy(新SampleClass());PowerMockito。doNothing()。当(间谍对象,“methodToMock”,