Brug af en liste over værdier i en JdbcTemplate IN-klausul

1. Introduktion

I en SQL-sætning kan vi bruge IN-operatøren til at teste, om et udtryk matcher en værdi i en liste. Derfor kan vi bruge IN-operatøren i stedet for flere ELLER-betingelser.

I denne vejledning viser vi, hvordan du sender en liste over værdier til IN-klausulen i en Spring JDBC-skabelonforespørgsel.

2. Bestået en Liste Parameter til I Klausul

IN-operatøren giver os mulighed for at specificere flere værdier i en WHERE-klausul. For eksempel kan vi bruge det til at finde alle medarbejdere, hvis id er på en specificeret id-liste:

VÆLG * FRA MEDARBEJDER, HVOR id i (1, 2, 3)

Typisk er det samlede antal værdier inde i IN-klausulen variabel. Derfor er vi nødt til at oprette en pladsholder, der kan understøtte en dynamisk liste over værdier.

2.1. Med JdbcTemplate

Med JdbcTemplate, kan vi bruge '?' tegn som pladsholdere for listen over værdier. Antallet af '?' tegn vil være de samme som størrelsen på listen:

Liste getEmployeesFromIdList (Liste-id'er) {String inSql = String.join (",", Collections.nCopies (ids.size (), "?")); Liste medarbejdere = jdbcTemplate.query (String.format ("SELECT * FROM EMPLOYEE WHERE id IN (% s)", inSql), ids.toArray (), (rs, rowNum) -> new Employee (rs.getInt ("id "), rs.getString (" first_name "), rs.getString (" last_name "))); tilbagevendende ansatte } 

I denne metode genererer vi først en pladsholderstreng, der indeholder ids.størrelse () '?' tegn adskilt med kommaer. Derefter sætter vi denne streng i IN-klausulen i vores SQL-sætning. For eksempel, hvis vi har tre tal i id'er liste, er SQL-sætningen:

VÆLG * FRA MEDARBEJDER HVOR id i (?,?,?)

I forespørgsel metode, passerer vi id'er liste som en parameter, der matcher pladsholderne i IN-klausulen. På denne måde kan vi udføre en dynamisk SQL-sætning baseret på inputliste over værdier.

2.2. Med NamedParameterJdbcTemplate

En anden måde at håndtere den dynamiske liste over værdier på er at bruge NamedParameterJdbcTemplate. For eksempel kan vi direkte oprette en navngivet parameter til inputlisten:

List getEmployeesFromIdListNamed (List ids) {SqlParameterSource parameters = new MapSqlParameterSource ("ids, ids); Liste medarbejdere = namedJdbcTemplate.query ("VÆLG * FRA MEDARBEJDER HVOR id I (: ids)", parametre, (rs, rowNum) -> ny medarbejder (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("sidste_navn"))); tilbagevendende medarbejdere }

I denne metode konstruerer vi først en MapSqlParameterSource objekt, der indeholder input-id-listen. Derefter bruger vi kun en navngivet parameter til at repræsentere den dynamiske liste over værdier.

Under kølerhjelmen, NamedParameterJdbcTemplate erstatter de navngivne parametre med '?' pladsholdere og anvendelser JdbcTemplate for at udføre forespørgslen.

3. Håndtering af en stor Liste

Når vi har et stort antal værdier på en liste, bør vi overveje alternative måder at overføre dem til JdbcTemplate forespørgsel.

For eksempel understøtter Oracle-databasen ikke mere end 1.000 liter i en IN-klausul.

En måde at gøre det på er at Opret en midlertidig tabel til listen. Imidlertid kan forskellige databaser have forskellige måder at oprette midlertidige tabeller på. For eksempel kan vi bruge OPRET GLOBAL MIDLERTIDIG TABEL erklæring for at oprette en midlertidig tabel i Oracle-databasen.

Lad os oprette en midlertidig tabel til H2-databasen:

List getEmployeesFromLargeIdList (List ids) {jdbcTemplate.execute ("CREATE TEMPORARY TABLE IF NOT EXISTS employee_tmp (id INT NOT NULL)"); Liste medarbejderIds = ny ArrayList (); for (Integer id: ids) {medarbejderIds.add (nyt objekt [] {id}); } jdbcTemplate.batchUpdate ("INDSÆT I medarbejder_tmp VÆRDIER (?)", medarbejder-ID'er); Liste medarbejdere = jdbcTemplate.query ("VÆLG * FRA MEDARBEJDER, HVOR id er (VÆLG id FRA medarbejder_tmp)", (rs, rowNum) -> ny medarbejder (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("sidste_navn"))); jdbcTemplate.update ("SLET FRA medarbejder_tmp"); tilbagevendende ansatte }

Her opretter vi først en midlertidig tabel, der indeholder alle værdierne på inputlisten. Derefter indsætter vi inputlistens værdier i denne tabel.

I vores resulterende SQL-sætning værdierne i IN-klausulen er fra den midlertidige tabel, og vi har undgået at konstruere en IN-klausul med et stort antal pladsholdere.

Endelig, når vi er færdige med forespørgslen, rydder vi op i den midlertidige tabel til fremtidig genbrug.

4. Konklusion

I denne vejledning viste vi, hvordan du bruger JdbcTemplate og NamedParameterJdbcTemplate for at videregive en liste over værdier til IN-klausulen i en SQL-forespørgsel. Vi leverede også en alternativ måde at håndtere et stort antal listeværdier på ved hjælp af en midlertidig tabel.

Som altid er kildekoden til artiklen tilgængelig på GitHub.


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