我必须创建一个命名查询,其中我需要按一些字段对结果进行分组,还需要使用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;