Trabalhando em torno do
IN
limite é ineficiente e o JPA nem sempre é a ferramenta certa para o trabalho. Considere o seguinte:-
Milhares de valores vinculados resultarão em potencialmente megabytes de SQL. Levará muito tempo para enviar esse SQL ao banco de dados. O banco de dados pode demorar mais para ler o texto SQL do que executá-lo conforme A resposta de Tom para a pergunta "Limite e conversão muito longa IN list:WHERE x IN ( ,,, ...)" .
-
Será ineficiente devido à análise SQL. Não apenas leva muito tempo para analisar esse SQL longo, mas cada invocação tem um número diferente de parâmetros vinculados que serão analisados e planejados separadamente (consulte este artigo que explica isso ).
-
Há um limite rígido de parâmetros vinculados em uma instrução SQL. Você pode repetir oOR
algumas vezes para contornar oIN
limite, mas você atingirá o limite da instrução SQL em algum momento.
Para esses tipos de consultas, geralmente é melhor criar temporário tabelas . Crie um antes de sua consulta, insira todos os identificadores nele e una-o com a tabela de entidades em sua consulta para simular o
IN
doença. Idealmente, você pode substituir o JPA por um procedimento armazenado, especialmente se estiver retirando dezenas de milhares de identificadores do banco de dados apenas para passá-los de volta ao banco de dados na próxima consulta.