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



我必须创建一个命名查询,其中我需要按一些字段对结果进行分组,还需要使用IN子句来限制结果。

它看起来有点像这个

SELECT new MyDTO(e.objID) FROM Entity e WHERE e.objId IN (:listOfIDs) GROUP BY e.attr1, e.attr2 

我使用的是OpenJPA和IBMDB2。在某些情况下,我的ID列表可能非常大(>80000个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;

相关内容

  • 没有找到相关文章

最新更新