在OpenJpa中使用大型列表的IN子句导致过于复杂的语句

时间:2014-10-06 06:51:32

标签: 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和IBM DB2。在某些情况下,我的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子句。

1 个答案:

答案 0 :(得分:0)

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

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;