当前位置: 首页 > 知识库问答 >
问题:

使用QuerySL具有多个可选参数的spring boot Get请求

羊舌高明
2023-03-14

我正尝试在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&param2=value2

共有1个答案

华瀚漠
2023-03-14

对于您的第一个问题,您可以使用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”,