Korištenje popisa vrijednosti u klauzuli JdbcTemplate IN

1. Uvod

U SQL izrazu možemo koristiti operator IN da testiramo podudara li se izraz s bilo kojom vrijednošću na popisu. Stoga možemo koristiti IN operator umjesto višestrukih ILI uvjeta.

U ovom uputstvu pokazat ćemo kako proslijediti popis vrijednosti u klauzulu IN proljetnog upita JDBC predloška.

2. Prolazak a Popis Parametar do U Klauzula

IN operator omogućuje nam da odredimo više vrijednosti u klauzuli WHERE. Na primjer, možemo ga koristiti za pronalaženje svih zaposlenika čiji se id nalazi na navedenom popisu id:

ODABERITE * OD ZAPOSLENIKA GDJE ID (1, 2, 3)

Uobičajeno je da je ukupan broj vrijednosti unutar klauzule IN promjenjiv. Stoga moramo stvoriti rezervirano mjesto koje može podržati dinamički popis vrijednosti.

2.1. S JdbcTemplate

S JdbcTemplate, možemo koristiti "?" znakovi kao rezervirana mjesta za popis vrijednosti. Broj '?' znakova bit će jednaka veličini popisa:

Popis getEfficieesFromIdList (ID-ovi popisa) {String inSql = String.join (",", Collections.nCopies (ids.size (), "?")); Popis zaposlenika = jdbcTemplate.query (String.format ("SELECT * FROM EMPLOYEE WHERE id IN (% s)", inSql), ids.toArray (), (rs, rowNum) -> novi zaposlenik (rs.getInt ("id "), rs.getString (" first_name "), rs.getString (" last_name "))); povratak zaposlenika; } 

Ovom metodom prvo generiramo niz rezerviranih mjesta koji sadrži ids.size () '?' znakovi odvojeni zarezima. Zatim stavimo ovaj niz u klauzulu IN naše SQL naredbe. Na primjer, ako imamo tri broja u id popis, SQL izraz je:

ODABERITE * OD ZAPOSLENIKA GDJE ID (?,?,?)

U upit metodu, prolazimo id popis kao parametar koji odgovara rezerviranjima mjesta unutar klauzule IN. Na taj način možemo izvršiti dinamički SQL izraz temeljen na popisu ulaznih vrijednosti.

2.2. S NamedParameterJdbcTemplate

Drugi način za rukovanje dinamičkim popisom vrijednosti je upotreba NamedParameterJdbcTemplate. Na primjer, možemo izravno stvoriti imenovani parametar za popis unosa:

Popis getEfficieesFromIdListNamed (Popis ID-ova) {SqlParameterSource parametri = novi MapSqlParameterSource ("ids", ids); Popis zaposlenika = namedJdbcTemplate.query ("SELECT * FROM EMPLOYEE WHERE id IN (: ids)", parametri, (rs, rowNum) -> novi zaposlenik (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("last_name"))); povratak zaposlenika; }

U ovoj metodi prvo konstruiramo a MapSqlParameterSource objekt koji sadrži popis ulaznih id. Tada koristimo samo jedan imenovani parametar za predstavljanje dinamičkog popisa vrijednosti.

Ispod haube, NamedParameterJdbcTemplate zamjenjuje imenovane parametre za "?" rezervirana mjesta i namjene JdbcTemplate za izvršavanje upita.

3. Rukovanje velikim Popis

Kada na popisu imamo velik broj vrijednosti, trebali bismo razmotriti alternativne načine za njihovo prenošenje u JdbcTemplate upit.

Na primjer, baza podataka Oracle ne podržava više od 1.000 literala u klauzuli IN.

Jedan od načina za to je stvoriti privremenu tablicu za popis. Međutim, različite baze podataka mogu imati različite načine za stvaranje privremenih tablica. Na primjer, možemo koristiti IZRADI GLOBALNI PRIVREMENI STOL izjava za stvaranje privremene tablice u Oracle bazi podataka.

Stvorimo privremenu tablicu za H2 bazu podataka:

Popis getEfficieesFromLargeIdList (ID-ovi popisa) {jdbcTemplate.execute ("IZRADI PRIVREMENU TABELU AKO NE POSTOJI worker_tmp (id INT NULL)"); Popis zaposlenikaIds = novi ArrayList (); for (Integer id: ids) {workerIds.add (novi objekt [] {id}); } jdbcTemplate.batchUpdate ("INSERT INTO worker_tmp VRIJEDNOSTI (?)", zaposlenički ID-ovi); Popis zaposlenika = jdbcTemplate.query ("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM zaposlenik_tmp)", (rs, rowNum) -> novi zaposlenik (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("last_name"))); jdbcTemplate.update ("IZBRIŠI IZ zaposlenika_tmp"); povratak zaposlenika; }

Ovdje prvo stvaramo privremenu tablicu koja sadrži sve vrijednosti popisa za unos. Zatim u ovu tablicu ubacujemo vrijednosti popisa za unos.

U našoj rezultirajućoj SQL izjavi, vrijednosti u klauzuli IN iz privremene su tablice, a mi smo izbjegli konstrukciju IN klauzule s velikim brojem rezerviranih mjesta.

Napokon, nakon što završimo upit, očistimo privremenu tablicu za buduću ponovnu upotrebu.

4. Zaključak

U ovom uputstvu pokazali smo kako se koristi JdbcTemplate i NamedParameterJdbcTemplate za prosljeđivanje popisa vrijednosti za IN klauzulu SQL upita. Također, pružili smo alternativni način obrade velikog broja vrijednosti popisa pomoću privremene tablice.

Kao i uvijek, izvorni kôd članka dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found