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

在 Dropwizard 中使用基于可选参数的 DAO 进行数据过滤

公冶谦
2023-03-14

我想在Dropwizard服务器中实现数据过滤。假设我们想寻找纪念碑。用户可以使用名称、城市、类别等过滤器从纪念碑列表中进行过滤。

uri 看起来像 /monuments?name=“Eiffel”

我不清楚如何实现这个API,因为一些用户可能在指定名称过滤器后就停止了,而其他人可能使用所有3个。

在这种情况下,如何在DAO中实现Java代码和查询,以根据传递的过滤器修改查询?

我所想到和尝试的:

1(最坏的情况)——为这些过滤器列出所有可能的查询组合,并根据传递的参数组合使用一个组合。

2 - 我以为 JDBI 会在调用 DAO 方法时自动消除 null 的参数,但事实并非如此,至少对于 ilike 子句(因为上述所有参数都是字符串)。

3-Postgres中的用例。但这是不可扩展的,因为随着用例的增加,我可能会有其他参数来搜索。

4-使用Java数据结构和DAO在内部过滤结果,比如首先根据(比方说)名称获取所有纪念碑,然后将Ids传递给带有城市子句的SQL查询,然后与类别子句相同。但是随着数据的增加,这将需要很长时间来处理。

这似乎是一个相当常见的场景,但我找不到任何好的答案,大多数人都在谈论URI和RESTful设计,而不是实现细节。


共有1个答案

微生烨然
2023-03-14

虽然@Hitobat建议的答案在您的可选参数很少的情况下会很好,但如果您正在处理大量可选参数,一个更优雅的解决方案是考虑创建一个请求pojo,并使用Hibernate Criterias,只有在参数不为空时才添加限制。

请求类别:

public class FilteredRequest{
    String name;
    String city;
    String category;
}

资源类:

@GET
@Path("/monuments")
public Response searchMonuments(@ApiParam("filters") FilteredRequest filteredRequest){
    return Response.ok().entity(monumentsDAO.findAll(filteredRequest)).build()
}

道:

public List<Monuments> class MonumentsDAO() {
    public findAll(FilteredRequest filteredRequest){
        Criteria criteria = getSearchCriteria(filteredRequest);
        return list(criteria);
    }

    private Criteria getSearchCriteria(FilteredRequest filteredRequest){
        Criteria criteria = criteria();
        if (StringUtils.isNotEmpty(filteredRequest.getName())) {
            criteria.add(Restrictions.eq("name", filteredRequest.getName()));
        }
        if (StringUtils.isNotEmpty(filteredRequest.getCity())) {
            criteria.add(Restrictions.eq("city", filteredRequest.getCity()));
        }
        if (StringUtils.isNotEmpty(filteredRequest.getCategory())) {
            criteria.add(Restrictions.eq("category", filteredRequest.getCategory()));
        }
        return criteria;
    }
}
 类似资料:
  • 所以我有表注释和作者。我想用许多可选参数构建复杂的搜索栏。我想用可选的作者名字/姓氏和一些标志来过滤评论,比如人气(基于评论评级)。 由于我不知道如何使用spring数据jpa存储库编写它,我一直在考虑使用@query注释将其编写为本机查询,像这样的smth应该可以工作 是否有使用Spring data jpa编写它的选项? 例如,将来我计划添加更多参数和分页。使用Spring就像使用sql查询1

  • 问题内容: 您能否指出我跳过JavaScript中可选参数的好方法。 例如,我想在这里丢弃所有参数: 问题答案: 解: 您应该使用而不是要跳过的可选参数,因为这100%会模拟JavaScript中可选参数的默认值。 小例子: 强烈建议 :如果您有很多参数,请使用JSON,并且可以在参数列表的中间包含可选参数。看看这是如何在jQuery中完成的。

  • 想象一下你有两个来源。例如,某一天在谷歌上搜索“iPhone”的频率有多高,某一天卖出了多少部iPhone。你会想到,如果某一天iPhone被搜索了很多,那么接下来的几天销量就会增加。如果你有过去3个月的数据,那么你就可以根据iPhone的搜索次数,或者根据过去的销售模式和过去几天的销售次数来预测未来几天的销售数量是增加还是减少。因此,您希望根据这2个来源对其中的1个(销售数量)进行预测。因此,如

  • 假设我有一个7列的数据帧,有些行有7个值,有些行的NAs超过了某个点。我想抓住最后一个值(从左到右),不是NA,然后直接向左的值。它是分层数据,但有些组比其他组更深。我想要最深和第二深的组在一个新的数据帧的两列。 这段代码可以工作,但对于46K观测值的数据帧,我的内存已达到最大。有没有比这更有效的方法? 第一次发帖。通常我可以拼凑我需要从这个网站。提前感谢。

  • 我在TypeScript中使用命名参数时遇到问题。我知道它不支持我在TypeScript中使用它的方式。 但是我该怎么做呢? 打字稿: JavaScript: 我在看(这没有成功): 有没有办法在JavaScript中的函数调用中提供命名参数? 如何将可选的命名参数添加到 TypeScript 函数参数? 我可以在 TypeScript 中做什么,以便在 JavaScript 中使用命名参数? 我

  • data.table,我们可以根据行号或条件选择行: 但是,我不能同时选择行数和条件: 这可能是因为在这种格式下没有被解释为行号。我知道我可以链接这两个条件: 但是我想为这个子集分配新的列值 现在,它只为中间链接的 data.table 创建了列。我可以保存中间表,然后合并回原始表,但那会很麻烦。 实际上,我经常觉得 需要一个正确的行号。一个依赖于组的动态数字,但我想要一个可以识别每一行的唯一ID