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

如何在Spring中将JdbcTemplate转换为Flux?

顾嘉德
2023-03-14

我有一个返回列表的现有服务

我如何将下面的示例转换为通量,这样我的结果就可以流式传输,而不必在内存中聚集所有项目?

@RestController
public class BookingInfoServlet {
    @Autowired
    private JdbcTemplate jdbc;

    @GetMapping(value = "/export", produces = APPLICATION_JSON_VALUE)
    public List<Item> export(String productType) {
        List<Item> list = new ArrayList<>();

        for (int i = 0; i < jdbc.count(); i++) {
            List<String> refIds = jdbc.queryForList("SELECT ref_id FROM products where type = ? LIMIT 1000 OFFSET = ?", String.class, productType, i);
            for (String id : refIds) {
                Map map = jdbc.queryForMap("SELECT <anything> ... where some_id = ?, id);
                Item item = new Item();
                item.setName(map.get("name"));
                item.setCode(map.getCode("code"));
                item.set...
                list.add(item);
            }

            //TODO how to convert to Flux here and already send the chunks back into the stream?
        }

        return list; //TODO how to convert to Flux?
    }
}

第一个问题:这里我首先将第一个查询的所有结果提取到内存中,然后在内存中迭代并形成我所有的Item,然后返回整个列表。

因此我试图返回Flux

由于没有asyncmysqljava驱动程序,我可能必须将数据库查找分页为1000个块,然后准备1000个项目并已经将它们流式传输回客户端。然后获取接下来的1000个项目。但是我如何直接将它们放入流中?


共有1个答案

方寒
2023-03-14
  public Flux<Item> export(String productType) {
    int pageSize = 1000;
    int count = jdbc.count();
    return Flux.range(0, count / pageSize) //page numbers
        .flatMapIterable(pageNumber ->
            jdbc.queryForList("SELECT ref_id FROM products where type = ? LIMIT ? OFFSET = ?",
                String.class,
                productType,
                pageSize,
                pageNumber * pageSize))
        .map(id -> {
          Map map = jdbc.queryForMap("SELECT <anything> ... where some_id = ?", id);
          Item item = new Item();
          //
          //
          return item;
        });
  }
 类似资料:
  • 如何将flux 转换为mono 对象?

  • 我找了无数的问题。但大多数问题如下。 实体- 但我不想这样。 若Dto中不存在实体中的属性值,我想知道如何将Dto转换为实体。 没有为[annotations,Lombok,jpa,…]指定代码,但是它存在! userService的所有方法都返回DTO。如何在Post实体中设置用户实体?我收到一个userDto返回,它只有用户名。 这种时候我该怎么办? 存储库不是直接从控制器调用的。 服务将无条

  • 问题内容: 我是Java的新手,想知道double转换为int cast如何工作吗?我知道,只需将低32位转换为int就很容易了,但是将double(64位)转换为int(32位)呢?来自二进制的double中的那64位是Double- precision浮点格式(Mantissa),那么它如何在内部转换为int? 问题答案: 所有这些都记录在JLS的5.1.3节中。 第一步,将浮点数转换为lon

  • 我有课 我有一个JSON请求 我有一个REST API 当我调用此API并可视化此student对象时,这两个字段都有我提供的请求中的值。 我不明白的是: JSON值如何直接映射到学生类对象 是否涉及序列化/反序列化 建构师在学生课堂上有什么重要性吗

  • 问题内容: 有没有办法将a 变成a 或将一个字母变成a (例如如何将a 变成a 和a 变成an )?(如果可以,请链接到相关文档)。 我该如何找到在文档中才隐约知道的类似内容? 问题答案: 您可以通过确定可能涉及的类来查找文档。在这里,候选人是和。 您应该先熟悉以下内容: 原始包装 中的Java Collection框架 它还有助于通过教程更慢地介绍API。 处理字符串中的字符

  • 问题内容: 我一直在这里找到问题,并且Google的人们遇到了麻烦,而不是遇到了其他麻烦。但我敢肯定,我不是以前已经从去碰到这种情况的唯一一个到。 我发现的唯一其他答案是“首先将其设置为Long”,这实际上并没有解决这个问题。 我最初尝试投射,但得到了“ ” 如您所料,我有点困惑,我被困住了,因为有些内容以形式出现,而我要存储其信息的实体要求序列号为Long。 问题答案: 请注意,强制转换为和强制