【问题标题】:JPA query: what is a proper way to select by a large set of possible values?JPA查询:通过大量可能值进行选择的正确方法是什么?
【发布时间】:2013-01-24 08:04:54
【问题描述】:

我拥有的是大量(如数十万)ID 列表。我想通过 JPA 查询从具有此 ID 的对象中获取一些值。

选项 1 - 使用 IN 子句

List<Long> ids = /* ... */
entityManager.createQuery(
        "SELECT v.lat, v.lon FROM Vehicle v WHERE v.id IN (:ids)",
        Long[].class)
    .setParameter("ids", ids)
    .getResultList();

恐怕IN 子句的内容可能会有限制。

选项 2 - 分别查询每个 ID

List<Long> ids = /* ... */
for (Long id : ids) {
    entityManager.createQuery(
            "SELECT v.lat, v.lon FROM Vehicle v WHERE v.id = :id",
            Long[].class)
        .setParameter("id", id)
        .getSingleResult();
}

这看起来太慢了,好像在做ids.size() 请求。

做这种事情的正确方法是什么?

【问题讨论】:

  • 只是一个评论。请注意,IN (id1, id2, id3, ..., idN) 语法可能有限制。例如。在 Oracle 上,此类列表中有 1000 个 id 的人为限制。

标签: java sql jpa entitymanager


【解决方案1】:

首先想到的是:

  1. 将 id 列表切割成 1000 个 id 的一部分。易于管理的尺寸。
  2. 为每个部分运行 IN 查询。
  3. 将结果汇总到一个列表中。

对于大数据集,并行执行 (2) 可以显着提高性能。

【讨论】:

  • 使用带有大量参数的IN-Clause,可能会很慢
【解决方案2】:

你的两种方法都没有什么优点。正如 Grzegorz 的评论中提到的,所有数据库都限制了您可以使用的列表项的数量。此外,您的查询可以包含多少个字符。所以列表已经出来了。

成千上万的个人查询似乎不明智(记住发帖指南 Dan,要有礼貌)。

如果这是我的问题,我会首先查看该 id 列表是如何生成的。这可能是一个数据库查询。如果是这样,我会制作该查询的新版本以获取经纬度。它可能是表连接,也可能是子查询。在不了解你的数据库结构的情况下,我无法给你任何详细的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多