Db2 OpenJpa中具有大列表的IN子句导致语句太复杂

Db2 OpenJpa中具有大列表的IN子句导致语句太复杂,db2,openjpa,in-clause,Db2,Openjpa,In Clause,我必须创建一个命名查询,在这里我需要按一些字段对结果进行分组,并使用IN子句来限制我的结果 看起来是这样的 SELECT new MyDTO(e.objID) FROM Entity e WHERE e.objId IN (:listOfIDs) GROUP BY e.attr1, e.attr2 我正在使用OpenJPA和IBMDB2。在某些情况下,我的ID列表可能非常大(>80.000个ID),然后生成的SQL语句对于DB2来说变得太复杂,因为最终生成的语句会打印出所有ID,如下所示:

我必须创建一个命名查询,在这里我需要按一些字段对结果进行分组,并使用IN子句来限制我的结果

看起来是这样的

SELECT new MyDTO(e.objID) FROM Entity e WHERE e.objId IN (:listOfIDs) GROUP BY e.attr1, e.attr2 
我正在使用OpenJPA和IBMDB2。在某些情况下,我的ID列表可能非常大(>80.000个ID),然后生成的SQL语句对于DB2来说变得太复杂,因为最终生成的语句会打印出所有ID,如下所示:

 SELECT new MyDTO(e.objID) FROM Entity e WHERE e.objId IN (1,2,3,4,5,6,7,...) GROUP BY e.attr1, e.attr2 

有什么好办法处理这种查询吗?一种可能的解决方法是将ID写入临时表,然后在此表上使用in子句。

您应该将所有值放入表中,并将查询重写为联接。这不仅可以解决您的查询问题,还应该更高效

declare global temporary table ids (
   objId int
) with replace on commit preserve rows;

--If this statement is too long, use a couple of insert statements.
insert into session.ids values
    (1,2,3,4,....);

select new mydto(e.objID) 
    from entity e 
    join session.ids i on 
       e.objId = i.objId 
group by e.attr1, e.attr2;

这可能有效,但如何访问JPQL语句中的临时表?我无法直接访问“会话”,因为它未被识别为实体。因此,这似乎是最好的解决方案。我不能使用全局临时表,但我的方法有效。我正在使用一个“普通”表,并根据需要用ID列表填充它。JPA实际上是为“很少”记录(可能仍然很多)而设计的,设置的大小不是它。你在做什么,一次搞乱那么多记录?您最好将批量加载到一个表中以加入(与现有答案类似,但有专门的工具)。