我拥有的是一个很大的(如数十万)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()
次请求。
做这种事情的正确方法是什么?
答案 0 :(得分:1)
你的方法都没有多大价值。正如Grzegorz的评论中所提到的,所有数据库都限制了您可以使用的列表项数量。此外,您的查询可以包含多少个字符也有限制。列表已经出来了。
成千上万的个人查询(记得发布指南Dan,礼貌)是不明智的。
如果这是我的问题,我会先看看如何生成id列表。这可能是一个数据库查询。如果是这样,我会创建该查询的新版本以获得拉特和大麻。它可能是表连接,也可能是子查询。在不知道您的数据库结构的情况下,我无法给您任何详细的建议。
答案 1 :(得分:-1)
首先想到的是:
对于大数据集,通过并行执行(2)可以显着提高性能。