【问题标题】:Spring JPA Query to get Sub-List of provided IDs not in TableSpring JPA Query 以获取不在表中提供的 ID 的子列表
【发布时间】:2022-08-13 22:55:58
【问题描述】:

有没有办法使用 Spring JPA 存储库查询来获取给定 ID 列表的表中不存在的 ID 的子列表?

像这样的东西:

@Query(value = \"Some query returning a sublist of orderIds not in TABLE\")
List<String> orderIdsNotInTable(@Param(\"orderIds\") List<String> orderIds);

我找到了一个链接here,但我想不出如何使它成为 JPA 查询。

编辑:这里的目标是节省运行内存,所以如果有数千个 id 和许多调用同时发生,我希望在不创建所有 id 的第二个副本的情况下处理它。

  • 您是否考虑过使用本机查询,或者您想保持与 DB 无关?
  • @vladtkachuk 我认为数据库不可知,因为此查询必须适用于不同的数据库系统

标签: java jpa spring-data-jpa


【解决方案1】:

根据您的问题,我的解决方案是:

  1. 检索数据库中存在的 ID 列表:
       @Query("select t.id from Table t")
        List<String> findAllIds();
    
    1. 遍历您拥有的 ID 列表并查找数据库表中的 ID 列表是否不包含您的 ID。
     List<String> idsNotContained= orderIds.stream()
        .filter(!findAllIds()::contains)
        .collect(Collectors.toList());
    

【讨论】:

  • 理想情况下,我希望在 thenquery 中完成所有操作,以在 api 中节省内存。
  • 您需要了解一件事,数据库将仅返回数据库中存在的值列表或基于您的参数的空列表。出于比较目的,您应在查询级别实现一个逻辑(子例程),该逻辑将返回其 ID 与您在数据库中的 ID 列不匹配的值。
  • 所以你不认为他们在我提供的链接中所做的事情对 jpa 是可能的吗?
  • 在您提供的链接中,他们以某种方式在数据库with v (id) as ( values (4),(5),(6) ) 上添加了缺失值,他想要数据库中不存在的值 5,如果您不以某种方式在数据库中提供所需的值不可行
  • @NickPavini 字符串 ID 列表将如何消耗 API 中的内存。您的列表是否包含 1 M 条记录?在这种情况下,从选择中提取列表的子部分,直到到达列表末尾,然后对每个子部分进行比较。
【解决方案2】:

在@Pawan.Java 解决方案的基础上,我会查找 ID,然后应用过滤。

List<String> findByIdIn(List<String> ids);

返回的列表将包含存在的 id,然后只需从原始列表中删除这些 id。

original.stream().filter(i -> 
  !existingIds.contains(i)).collect(Collectors.toList());

如果传入了大量的 id,那么您可能需要考虑将它们拆分为并行批次。

【讨论】:

    【解决方案3】:
    @Query(value = "SELECT t.id FROM TABLE t WHERE t.id NOT IN :orderIds")
    List<String> orderIdsNotInTable(@Param("orderIds") List<String> orderIds);
    

    我不知道我是否理解正确,但您可以尝试上面的解决方案。

    【讨论】:

    • 此查询将输出传递的参数中不存在的所有 ID。从我的角度来看,问题是寻找所有没有从数据库中返回对象的 ID 并因此输出这些 ID。
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    • 这将返回与订单 ID 不匹配的行。他想要得到缺少的 id - 返回“no”行的 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2018-01-19
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多