JPA查询:通过大量可能的值进行选择的正确方法是什么?

时间:2013-02-08 14:19:30

标签: java sql jpa entitymanager

我拥有的是一个很大的(如数十万)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()次请求。

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

2 个答案:

答案 0 :(得分:1)

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

成千上万的个人查询(记得发布指南Dan,礼貌)是不明智的。

如果这是我的问题,我会先看看如何生成id列表。这可能是一个数据库查询。如果是这样,我会创建该查询的新版本以获得拉特和大麻。它可能是表连接,也可能是子查询。在不知道您的数据库结构的情况下,我无法给您任何详细的建议。

答案 1 :(得分:-1)

首先想到的是:

  1. 在1000个ID的部分内容中删除id列表。一个可管理的大小。
  2. 为每个部分运行IN查询。
  3. 将结果汇总到列表中。
  4. 对于大数据集,通过并行执行(2)可以显着提高性能。