Omgå IN
grænse er ineffektiv, og JPA er ikke altid det rigtige værktøj til opgaven. Overvej følgende:
-
Tusindvis af bundne værdier vil resultere i potentielt megabyte SQL. Det vil tage lang tid at sende denne SQL til databasen. Databasen kan tage længere tid at læse SQL-teksten end at udføre den i henhold til Toms svar på spørgsmålet "Grænse og konvertering meget lang IN-liste:WHERE x IN ( ,,, ...)" .
-
Det vil være ineffektivt på grund af SQL-parsing. Ikke alene tager det lang tid at parse denne lange SQL, men hver påkaldelse har et forskelligt antal bundne parametre, som vil blive parset og planlagt separat (se denne artikel, der forklarer det ).
-
Der er en hård grænse for bundne parametre i en SQL-sætning. Du kan gentage
OR
et par gange for at omgåIN
limit, men du kommer til at ramme SQL-sætningsgrænsen på et tidspunkt.
For disse typer forespørgsler er det normalt bedre at oprette midlertidigt tabeller
. Opret en før din forespørgsel, indsæt alle identifikatorerne i den, og forbind den med entitetstabellen i din forespørgsel for at simulere IN
tilstand.
Ideelt set kan du erstatte JPA med en lagret procedure, især hvis du trækker titusindvis af identifikatorer ud fra databasen bare for at sende dem tilbage til databasen i den næste forespørgsel.