我必须创建一个命名查询,我需要通过某些字段对结果进行分组,并使用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子句。
答案 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;