כמו שאילתות במאגרי JPA באביב

1. הקדמה

במדריך מהיר זה, נסקור דרכים שונות ליצירת שאילתות LIKE במאגרי JPA באביב.

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

2. התקנה

לדוגמא שלנו, אנו נשאול א סרט שולחן.

בואו נגדיר את שלנו סרט יֵשׁוּת:

@Entity בכיתה ציבורית סרט {@Id @GeneratedValue (אסטרטגיה = GenerationType.SEQUENCE) פרטי מזהה ארוך; כותרת מחרוזת פרטית; במאי מחרוזת פרטי; דירוג מחרוזת פרטי; משך זמן פרטי; // סטרים וקובעים סטנדרטיים}

עם שלנו סרט מוגדר ישות, בואו ליצור כמה הצהרות להוסיף דוגמאות:

הכנס לסרט (מזהה, כותרת, במאי, דירוג, משך זמן) ערכים (1, 'גודזילה: מלך המפלצות', 'מייקל דוברטי', 'PG-13', 132); הכנס לסרט (מזהה, כותרת, במאי, דירוג, משך זמן) ערכים (2, 'הנוקמים: סוף המשחק', 'אנתוני רוסו', 'PG-13', 181); הכנס לסרט (מזהה, כותרת, במאי, דירוג, משך זמן) ערכים (3, 'קפטן מארוול', 'אנה בודן', 'PG-13', 123); הכנס לסרט (מזהה, כותרת, במאי, דירוג, משך זמן) ערכים (4, 'דמבו', 'טים ברטון', 'PG', 112); הכנס לסרט (מזהה, כותרת, במאי, דירוג, משך זמן) ערכים (5, 'Booksmart', 'Olivia Wilde', 'R', 102); הכנס לסרט (מזהה, כותרת, במאי, דירוג, משך זמן) ערכים (6, 'אלאדין', 'גיא ריצ'י', 'PG', 128); הכנס לסרט (מזהה, כותרת, במאי, דירוג, משך זמן) ערכים (7, 'The Sun Is also a Star', 'Ry Russo-Young', 'PG-13', 100);

3. LIKE שיטות שאילתה

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

בואו נחקור אותם עכשיו.

3.1. מֵכִיל, מכיל, האם מכיל ו כמו

בואו נסתכל כיצד נוכל לבצע את שאילתת ה- LIKE הבאה בשיטת שאילתה:

בחר * מתוך הסרט איפה הכותרת כמו '% ב-%';

ראשית, נגדיר שיטות שאילתה באמצעות מֵכִיל, מכיל, ו האם מכיל:

רשימה findByTitleContaining (כותרת מחרוזת); רשימה findByTitleContains (כותרת מחרוזת); רשימה findByTitleIsContaining (כותרת מחרוזת);

בואו נקרא לשיטות השאילתה שלנו עם הכותרת החלקית ב:

תוצאות רשימה = movieRepository.findByTitleContaining ("ב"); assertEquals (3, results.size ()); תוצאות = movieRepository.findByTitleIsContaining ("ב"); assertEquals (3, results.size ()); תוצאות = movieRepository.findByTitleContains ("ב"); assertEquals (3, results.size ());

אנו יכולים לצפות שכל אחת משלוש השיטות תחזיר את אותן התוצאות.

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

בואו נגדיר שיטת שאילתות LIKE:

רשימה findByTitleLike (כותרת מחרוזת);

עכשיו, בואו נקרא שלנו findByTitleLike שיטה עם אותו ערך שהשתמשנו בו בעבר, אך כוללת את תווי התו הכללי:

תוצאות = movieRepository.findByTitleLike ("% ב-%"); assertEquals (3, results.size ());

3.2. מתחיל עם

עכשיו, בואו נסתכל על השאילתה הבאה:

בחר * מתוך הסרט איפה דירוג כמו 'PG%';

בואו נשתמש ב- מתחיל עם מילת מפתח ליצירת שיטת שאילתה:

רשימה findByRatingStartsWith (דירוג מחרוזת);

עם הגדרת השיטה שלנו, בואו נקרא לזה עם הערך PG:

תוצאות רשימה = movieRepository.findByRatingStartsWith ("PG"); assertEquals (6, results.size ());

3.3. נגמר עם

האביב מספק לנו את הפונקציונליות ההפוכה עם ה- נגמר עם מילת מפתח.

בואו ניקח בחשבון שאילתה זו:

בחר * מתוך הסרט איפה הבמאי אוהב 'ברטון';

עכשיו, בואו נגדיר נגמר עם שיטת שאילתה:

רשימה findByDirectorEndsWith (במאי מחרוזות);

לאחר שהגדרנו את השיטה שלנו, בואו נקרא לה עם ה- ברטון פָּרָמֶטֶר:

תוצאות רשימה = movieRepository.findByDirectorEndsWith ("ברטון"); assertEquals (1, results.size ());

3.4. רגישות למקרה

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

עם אביב JPA, אנו יכולים להשתמש ב- IgnoreCase מילת מפתח בשילוב עם אחת ממילות המפתח האחרות שלנו:

רשימה findByTitleContainingIgnoreCase (כותרת מחרוזת);

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

תוצאות רשימה = movieRepository.findByTitleContainingIgnoreCase ("the"); assertEquals (2, results.size ());

3.5. לֹא

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

בואו נגדיר שאילתה באמצעות לא מכיל למצוא סרטים עם דירוגים שאינם מכילים PG:

רשימה findByRatingNotContaining (דירוג מחרוזת);

עכשיו, בואו נקרא לשיטה החדשה שהוגדרה:

תוצאות רשימה = movieRepository.findByRatingNotContaining ("PG"); assertEquals (1, results.size ());

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

רשימה findByDirectorNotLike (מנהל מחרוזות);

לסיום, בואו נקרא לשיטה למצוא את כל הסרטים שבהם שם הבמאי מתחיל במשהו אחר מאשר An:

תוצאות רשימה = movieRepository.findByDirectorNotLike ("An%"); assertEquals (5, results.size ());

אנחנו יכולים להשתמש לא כמו באופן דומה להשיג א לֹא בשילוב עם נגמר עם סוג של פונקציונליות.

4. שימוש @שאילתא

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

4.1. פרמטרים בשם

למטרות השוואה, בואו ניצור שאילתה המקבילה ל- findByTitleContaining שיטה שהגדרנו קודם:

@Query ("בחר m מתוך הסרט m WHERE m.title LIKE%: title%") רשימת searchByTitleLike (@Param ("title") כותרת מחרוזת);

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

4.2. פרמטרים מסודרים

בנוסף לפרמטרים שצוינו, אנו יכולים להשתמש בפרמטרים מסודרים בשאילתות שלנו:

@Query ("בחר m מתוך סרט m איפה m.rating LIKE? 1%") חיפוש רשימה ByRatingStartsWith (דירוג מחרוזת);

יש לנו שליטה על התווים הכלליים שלנו, ולכן שאילתה זו מקבילה ל- findByRatingStartsWith שיטת שאילתה.

בואו נמצא את כל הסרטים עם דירוג החל מ PG:

תוצאות רשימה = movieRepository.searchByRatingStartsWith ("PG"); assertEquals (6, results.size ());

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

אם אנו משתמשים באביב אתחול 2.4.1 ואילך, אנו יכולים להשתמש ב- SpEL בריחה שיטה:

@Query ("בחר m מתוך סרט m איפה m.director LIKE%? # {Escape ([0])} להימלט? # {EscapeCharacter ()}") חיפוש searchByDirectorEndsWith (במאי מחרוזת);

עכשיו, בואו נקרא לשיטה שלנו עם הערך ברטון:

תוצאות רשימה = movieRepository.searchByDirectorEndsWith ("ברטון"); assertEquals (1, results.size ());

5. מסקנה

במדריך קצר זה למדנו כיצד ליצור שאילתות LIKE במאגרי JPA באביב.

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

קוד הדוגמה המלא זמין ב- GitHub.