שימוש ברשימת ערכים בסעיף JdbcTemplate IN

1. הקדמה

בהצהרת SQL, אנו יכולים להשתמש במפעיל IN כדי לבדוק אם ביטוי תואם ערך כלשהו ברשימה. לכן, אנו יכולים להשתמש במפעיל IN במקום בתנאי OR מרובים.

במדריך זה נראה כיצד להעביר רשימת ערכים לסעיף IN של שאילתת תבנית Spring JDBC.

2. עובר א רשימה פרמטר ל IN סָעִיף

אופרטור ה- IN מאפשר לנו לציין מספר ערכים בסעיף WHERE. לדוגמה, אנו יכולים להשתמש בו כדי למצוא את כל העובדים שמזהה שלהם נמצא ברשימת מזהים מוגדרת:

בחר * מהעובד איפה שנמצא (1, 2, 3)

בדרך כלל, המספר הכולל של הערכים בתוך סעיף IN משתנה. לכן עלינו ליצור מציין מיקום שיכול לתמוך ברשימת ערכים דינמית.

2.1. עם JdbcTemplate

עם JdbcTemplate, אנו יכולים להשתמש ב'? ' תווים כמצייני מיקום עבור רשימת הערכים. מספר ה '?' התווים יהיו זהים לגודל הרשימה:

רשימה getEmployeesFromIdList (מזהי רשימה) {String inSql = String.join (",", Collections.nCopies (ids.size (), "?")); רשימת עובדים = jdbcTemplate.query (String.format ("SELECT * FROM EMPLYEEEE WHERE id IN (% s)", inSql), ids.toArray (), (rs, rowNum) -> עובד חדש (rs.getInt ("id "), rs.getString (" שם ראשון "), rs.getString (" שם אחרון "))); עובדים להחזיר; } 

בשיטה זו, אנו מייצרים תחילה מחרוזת מציין מיקום המכילה ids.size () '?' תווים מופרדים בפסיקים. לאחר מכן, אנו מכניסים מחרוזת זו לסעיף IN של משפט SQL שלנו. לדוגמא, אם יש לנו שלושה מספרים ב- מזהים רשימה, משפט SQL הוא:

בחר * מהעובד היכן נמצא (?,?,?)

בתוך ה שאילתא שיטה, אנו מעבירים את מזהים הרשימה כפרמטר כדי להתאים את מצייני המיקום בסעיף IN. בדרך זו אנו יכולים לבצע משפט SQL דינמי על בסיס רשימת הקלט של הערכים.

2.2. עם NamedParameterJdbcTemplate

דרך נוספת להתמודד עם רשימת הערכים הדינמית היא שימוש NamedParameterJdbcTemplate. לדוגמה, אנו יכולים ליצור ישירות פרמטר בשם לרשימת הקלט:

רשימת getEmployeesFromIdListNamed (רשימה מזהים) {SqlParameterSource פרמטרים = MapSqlParameterSource חדש ("ids, ids); רשימת עובדים = namedJdbcTemplate.query ("בחר * מהעובד איפה ש- IN: ids)", פרמטרים, (rs, rowNum) -> עובד חדש (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("שם אחרון"))); עובדים להחזיר; }

בשיטה זו אנו בונים תחילה א MapSqlParameterSource אובייקט המכיל את רשימת מזהי הקלט. לאחר מכן, אנו משתמשים רק בפרמטר אחד בשם כדי לייצג את רשימת הערכים הדינמית.

מתחת למכסת המנוע, NamedParameterJdbcTemplate מחליף את הפרמטרים שצוינו עבור '?' מצייני מקום ושימושים JdbcTemplate לביצוע השאילתה.

3. טיפול בגדול רשימה

כשיש לנו מספר רב של ערכים ברשימה, עלינו לשקול דרכים חלופיות להעביר אותם אל ה- JdbcTemplate שאילתא.

לדוגמה, מסד הנתונים של Oracle אינו תומך ביותר מ -1,000 ליטרלים בסעיף IN.

אחת הדרכים לעשות זאת היא צור טבלה זמנית לרשימה. עם זאת, למסדי נתונים שונים יכולות להיות דרכים שונות ליצור טבלאות זמניות. לדוגמה, אנו יכולים להשתמש ב- צור שולחן זמני זמני הצהרה ליצירת טבלה זמנית במסד הנתונים של אורקל.

בוא ניצור טבלה זמנית עבור מסד הנתונים H2:

רשימת getEmployeesFromLargeIdList (מזהי רשימה) {jdbcTemplate.execute ("צור טבלה זמנית אם לא קיים עובד_טמפ (id INT לא NULL)"); רשימת עובדIds = ArrayList חדש (); עבור (מספר שלם: ids) {עובדIds.add (אובייקט חדש [] {id}); } jdbcTemplate.batchUpdate ("INSERT INTO עובד_tmp VALUES (?)", עובדIds); רשימת עובדים = jdbcTemplate.query ("SELECT * FROM EMOYEEERE Where id IN (SELECT id FROM employee_tmp)", (rs, rowNum) -> עובד חדש (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("שם אחרון"))); jdbcTemplate.update ("מחק מעובד_טmp"); עובדים להחזיר; }

כאן ראשית, אנו יוצרים טבלה זמנית שתכיל את כל הערכים של רשימת הקלט. לאחר מכן, אנו מכניסים את ערכי רשימת הקלט לטבלה זו.

בהצהרת SQL המתקבלת שלנו, הערכים בסעיף IN הם מהטבלה הזמנית, ונמנענו מבניית סעיף IN עם מספר גדול של מצייני מיקום.

לבסוף, לאחר סיום השאילתה, אנו מנקים את הטבלה הזמנית לשימוש חוזר בעתיד.

4. מסקנה

במדריך זה הראינו כיצד להשתמש JdbcTemplate ו NamedParameterJdbcTemplate להעביר רשימת ערכים עבור סעיף IN של שאילתת SQL. כמו כן, סיפקנו דרך חלופית לטפל במספר רב של ערכי רשימה באמצעות טבלה זמנית.

כמו תמיד, קוד המקור של המאמר זמין באתר GitHub.


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