0

我所拥有的是大量(如数十万)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()请求。

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

4

2 回答 2

1

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

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

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

于 2013-02-08T14:39:23.003 回答
-1

首先想到的是:

  1. 将 id 列表切割成 1000 个 id 的一部分。可管理的大小。
  2. 对每个部分运行 IN 查询。
  3. 将结果聚合到一个列表中。

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

于 2013-02-08T14:34:36.577 回答