Použitie zoznamu hodnôt v klauzule JdbcTemplate IN

1. Úvod

V príkaze SQL môžeme pomocou operátora IN otestovať, či sa výraz zhoduje s ľubovoľnou hodnotou v zozname. Preto môžeme namiesto viacerých podmienok OR použiť operátor IN.

V tomto tutoriáli si ukážeme, ako odovzdať zoznam hodnôt do klauzuly IN dotazu na šablónu Spring JDBC.

2. Absolvovanie a Zoznam Parameter do IN Doložka

Operátor IN nám umožňuje určiť viac hodnôt v klauzule WHERE. Môžeme ho napríklad použiť na vyhľadanie všetkých zamestnancov, ktorých identifikácia sa nachádza v zadanom zozname identifikátorov:

VYBERTE * OD ZAMESTNÁVATEĽA KDE ID IN (1, 2, 3)

Celkový počet hodnôt v klauzule IN je zvyčajne variabilný. Preto musíme vytvoriť zástupný symbol, ktorý môže podporovať dynamický zoznam hodnôt.

2.1. S JdbcTemplate

S JdbcTemplate, môžeme použiť ‘? ' znaky ako zástupné symboly pre zoznam hodnôt. Počet '?' znaky budú rovnaké ako veľkosť zoznamu:

Zoznam getEmployeesFromIdList (zoznam ID) {String inSql = String.join (",", Collections.nCopies (ids.size (), "?")); Zoznam zamestnancov = jdbcTemplate.query (String.format ("SELECT * FROM EMPLOYEE WHERE id IN (% s)", inSql), ids.toArray (), (rs, rowNum) -> new Employee (rs.getInt ("id "), rs.getString (" krstné meno "), rs.getString (" priezvisko "))); vrátiť zamestnancov; } 

V tejto metóde najskôr vygenerujeme zástupný reťazec, ktorý obsahuje ids.size () „?“ znaky oddelené čiarkami. Potom vložíme tento reťazec do klauzuly IN nášho príkazu SQL. Napríklad ak máme tri čísla v ids zozname je príkaz SQL:

VYBERTE * OD ZAMESTNÁVATEĽA KDE id ID (?,?,?)

V dopyt metóda, minieme ids zoznam ako parameter, ktorý sa zhoduje so zástupnými symbolmi vo vnútri klauzuly IN. Týmto spôsobom môžeme vykonať dynamický príkaz SQL na základe vstupného zoznamu hodnôt.

2.2. S NamedParameterJdbcTemplate

Ďalším spôsobom, ako spracovať dynamický zoznam hodnôt, je použitie NamedParameterJdbcTemplate. Napríklad môžeme priamo vytvoriť pomenovaný parameter pre vstupný zoznam:

Zoznam getEmployeesFromIdListNamed (zoznam ID) {SqlParameterSource parametre = nový MapSqlParameterSource ("IDS", IDS); Zoznam zamestnancov = namedJdbcTemplate.query ("SELECT * FROM EMPLOYEE WHERE id IN (: ids)", parametre, (rs, rowNum) -> nový zamestnanec (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("priezvisko"))); vrátiť zamestnancov; }

Pri tejto metóde najskôr zostrojíme a MapSqlParameterSource objekt, ktorý obsahuje zoznam vstupných id. Potom použijeme iba jeden pomenovaný parameter, ktorý predstavuje dynamický zoznam hodnôt.

Pod kapotou, NamedParameterJdbcTemplate nahradí pomenované parametre znakom „?“ zástupné symboly a použitia JdbcTemplate vykonať dopyt.

3. Manipulácia s veľkým Zoznam

Keď máme v zozname veľké množstvo hodnôt, mali by sme zvážiť alternatívne spôsoby ich odovzdania do JdbcTemplate dopyt.

Napríklad databáza Oracle nepodporuje viac ako 1 000 literálov v klauzule IN.

Jedným zo spôsobov, ako to dosiahnuť, je vytvorte dočasnú tabuľku pre zoznam. Rôzne databázy však môžu mať rôzne spôsoby vytvárania dočasných tabuliek. Napríklad môžeme použiť VYTVORIŤ GLOBÁLNU DOČASNÚ TABUĽKU príkaz na vytvorenie dočasnej tabuľky v databáze Oracle.

Vytvorme dočasnú tabuľku pre databázu H2:

Zoznam getEmployeesFromLargeIdList (zoznam ID) {jdbcTemplate.execute ("VYTVORIŤ DOČASNÚ TABUĽKU, AK NIE JE EXISTUJÚCA employee_tmp (ID INT NIE NULL)"); List employeeIds = new ArrayList (); pre (Integer id: ids) {employeeIds.add (nový objekt [] {id}); } jdbcTemplate.batchUpdate ("VLOŽTE DO HODNOTY zamestnanca_tmp (?)", id zamestnanca); Zoznam zamestnancov = jdbcTemplate.query ("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", (rs, rowNum) -> nový zamestnanec (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("priezvisko"))); jdbcTemplate.update ("ODSTRÁNIŤ ZO zamestnanca_tmp"); vrátiť zamestnancov; }

Tu najskôr vytvoríme dočasnú tabuľku, ktorá bude obsahovať všetky hodnoty vstupného zoznamu. Potom do tejto tabuľky vložíme hodnoty vstupného zoznamu.

V našom výslednom príkaze SQL hodnoty v klauzule IN sú z dočasnej tabuľky, a vyhli sme sa konštrukcii klauzuly IN s veľkým počtom zástupných znakov.

Nakoniec po dokončení dotazu vyčistíme dočasnú tabuľku pre ďalšie použitie v budúcnosti.

4. Záver

V tomto tutoriáli sme si ukázali, ako sa používa JdbcTemplate a NamedParameterJdbcTemplate odovzdať zoznam hodnôt pre klauzulu IN dotazu SQL. Poskytli sme tiež alternatívny spôsob spracovania veľkého počtu hodnôt zoznamu pomocou dočasnej tabuľky.

Zdrojový kód článku je ako vždy k dispozícii na stránkach GitHub.


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