Der er et par ting her. Først og fremmest kan du ikke binde en IN-liste, det er jeg i hvert fald ret sikker på, at du ikke kan. Jeg formoder, at Hibernate bruger en slags trick, du sætter dit array-indhold ind i en statisk inlist, som Oracle kan bruge.
For det andet, hvis denne forespørgsel udføres med mange forskellige parametre, skal du binde variabler, ellers vil hele databasens ydeevne lide.
Når det er sagt, er der en måde at binde en IN-liste ved hjælp af et 'trick', som Tom Kyte beskriver på sin blog -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Koden derinde ser sådan ud:
[email protected]> with bound_inlist
2 as
3 (
4 select
5 substr(txt,
6 instr (txt, ',', 1, level ) + 1,
7 instr (txt, ',', 1, level+1) - instr (txt, ',', 1, level) -1 )
8 as token
9 from (select ','||:txt||',' txt from dual)
10 connect by level <= length(:txt)-length(replace(:txt,',',''))+1
11 )
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
SYSTEM 5 30-JUN-05
OPS$TKYTE 104 20-JAN-06
Delen:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Er dybest set der, hvor din forespørgsel går. Bitten ovenfor er tricket, som opdeler den kommaseparerede streng i en liste med værdier. I stedet for at binde en liste til :txt-pladsholderen, skal du konvertere listen til en streng og bare binde den.
Er du sikker på, at forskellen i forespørgselstider ikke skyldes caching eller indlæsningsvariationer på maskinen? Parsing af forespørgslen vil tage lidt tid, men flere sekunder er lang tid.