שאילתת נתוני JPA באביב לפי דוגמה

1. הקדמה

במדריך זה אנו הולכים למד כיצד לבצע שאילתות על נתונים באמצעות שאילתת נתוני אביב לפי API לדוגמה.

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

בואו נתחיל!

2. נתוני הבדיקה

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

שם פרטישם משפחהמספר מושב
ג'ילנַפָּח50
עֶרֶבג'קסון94
פרדבלוגים22
ריקיבובי36
סייאקוליסי85

3. תחום

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

ראשית, עיצבנו את המודל שלנו נוֹסֵעַ כישות JPA:

@Etity class נוסע {@Id @GeneratedValue @Column (nullable = false) פרטי מזהה ארוך; @Basic (אופציונלי = false) @Column (nullable = false) פרטי מחרוזת שם פרטי; @ Basic (אופציונלי = שקר) @Column (nullable = false) שם משפחה פרטי מחרוזת; @Basic (אופציונלי = שקר) @Column (בטל = שקר) int privateNumber; // בונה, גטרים וכו '}

במקום להשתמש ב- JPA, היינו יכולים לעצב זאת כהפשטה נוספת.

4. שאילתה לפי API לדוגמה

ראשית, בואו נסתכל על ה- מאגר Jpa מִמְשָׁק. כפי שאנו רואים זה מרחיב את QueryByExampleExecutor ממשק לתמיכה בשאילתה בדוגמה:

ממשק ציבורי JpaRepository מרחיב PagingAndSortingRepository, QueryByExampleExecutor {}

ממשק זה מציג גרסאות נוספות של למצוא() שיטה שאנו מכירים מ- Spring Data. עם זאת, כל שיטה גם מקבלת מופע של דוגמא:

ממשק ציבורי QueryByExampleExecutor {Optional findOne (דוגמה var1); Iterable findAll (דוגמה var1); איטרבל findAll (דוגמה var1, מיין var2); עמוד findAll (דוגמה var1, var2 Pageable); ספירה ארוכה (דוגמה var1); בוליאני קיים (דוגמה var1); }

שנית, ה דוגמא ממשק חושף שיטות לגישה ל- בְּדִיקָה וה דוגמה התאמה.

חשוב להבין כי בְּדִיקָה הוא המקרה של שלנו יֵשׁוּת:

ממשק ציבורי דוגמה {static org.springframework.data.domain.Example of (T probe) {return new TypedExample (probe, ExampleMatcher.matching ()); } org.springframework.data.domain.static.example of (T probe, ExampleMatcher matcher) {return new TypedExample (probe, matcher); } T getProbe (); ExampleMatcher getMatcher (); ברירת מחדל למחלקה getProbeType () {להחזיר ProxyUtils.getUserClass (this.getProbe (). getClass ()); }}

לסיכום, שלנו בְּדִיקָה ושלנו דוגמה התאמה יחד ציין את השאילתה שלנו.

5. מגבלות

כמו כל הדברים, ל- Query by Example API יש כמה מגבלות. לדוגמה:

  • הצהרות קינון וקיבוץ אינן נתמכות, למשל: (שם פרטי =? 0 ו- שם משפחה =? 1) או מספר מושב = ?2
  • התאמת מחרוזות כוללת רק מדויק, חסר רישיות, התחלות, סיומות, מכיל וממשק מחדש
  • כל הסוגים שאינם חוּט הם בהתאמה מדויקת בלבד

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

6. דוגמאות

6.1. התאמה לרגלית-רישיות

נתחיל בדוגמה פשוטה ונדבר על התנהגות ברירת המחדל:

@ מבחן בטל פומבי givenPassengers_whenFindByExample_thenExpectedReturned () {דוגמה לדוגמא = דוגמה.of (Passenger.from ("Fred", "Bloggs", null)); בפועל אופציונלי = repository.findOne (דוגמה); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), actual.get ()); }

בפרט, הסטטי דוגמא של() שיטה בונה דוגמא באמצעות ExampleMatcher.matching ().

במילים אחרות, התאמה מדויקת תתבצע בכל המאפיינים שאינם אפסים שֶׁל נוֹסֵעַ. לפיכך, ההתאמה רגישה לאותיות רישיות חוּט נכסים.

עם זאת, זה לא יהיה שימושי אם כל מה שאנחנו יכולים לעשות היה התאמה מדויקת לכל המאפיינים שאינם אפסיים.

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

6.2. התאמה שאינה תלויה-רישיות

עם זאת, בואו נסתכל על דוגמא אחרת, הפעם באמצעות withIgnoreCase () כדי להשיג התאמה שאיננה רגישה לאותיות רישיות:

@Test הציבור בטל givenPassengers_whenFindByExampleCaseInsensitiveMatcher_thenExpectedReturned () {ExampleMatcher caseInsensitiveExampleMatcher = ExampleMatcher.matchingAll (). WithIgnoreCase (); דוגמא לדוגמא = Example.of (Passenger.from ("fred", "bloggs", null), caseInsensitiveExampleMatcher); בפועל אופציונלי = repository.findOne (דוגמה); assertTrue (actual.isPresent ()); assertEquals (Passenger.from ("Fred", "Bloggs", 22), actual.get ()); }

בדוגמה זו, שימו לב שהתקשרנו לראשונה ExampleMatcher.matchingAll () - יש לו אותה התנהגות כמו ExampleMatcher.matching (), בו השתמשנו בדוגמה הקודמת.

6.3. התאמה אישית

אנחנו יכולים גם כוונן את התנהגות המתאים שלנו על בסיס נכס ולהתאים לכל נכס המשתמש ExampleMatcher.matchingAny ():

@ מבחן בטל פומבי givenPassengers_whenFindByExampleCustomMatcher_thenExpectedReturned () {Passager jill = Passenger.from ("Jill", "Smith", 50); ערב נוסע = Passenger.from ("Eve", "Jackson", 95); נוסע פרד = Passenger.from ("פרד", "בלוגס", 22); נוסע סיאה = Passenger.from ("Siya", "Kolisi", 85); נוסע ריקי = Passenger.from ("ריקי", "בובי", 36); ExampleMatcher customExampleMatcher = ExampleMatcher.matchingAny () .withMatcher ("firstName", ExampleMatcher.GenericPropertyMatchers.contains (). IgnoreCase ()) .withMatcher ("lastName", ExampleMatcher.GenericPropertyMatchers.contains ()); ignorCase דוגמא לדוגמא = Example.of (Passenger.from ("e", "s", null), customExampleMatcher); רשימת הנוסעים = repository.findAll (דוגמה); assertThat (נוסעים, מכיל (ג'יל, ערב, פרד, סייא)); טוענים כי (נוסעים, לא (מכיל (ריקי))); }

6.4. התעלמות ממאפיינים

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

אנו משיגים זאת על ידי התעלמות מכמה מאפיינים באמצעות ExampleMatcher.ignorePaths (מחרוזת ... נתיבים):

@ מבחן בטל פומבי givenPassengers_whenFindByIgnoringMatcher_thenExpectedReturned () {Passenger jill = Passenger.from ("Jill", "Smith", 50); ערב נוסע = Passenger.from ("Eve", "Jackson", 95); נוסע פרד = Passenger.from ("פרד", "בלוגס", 22); נוסע סיאה = Passenger.from ("Siya", "Kolisi", 85); נוסע ריקי = Passenger.from ("ריקי", "בובי", 36); ExampleMatcher ignoringExampleMatcher = ExampleMatcher.matchingAny () .withMatcher ("lastName", ExampleMatcher.GenericPropertyMatchers.startsWith (). IgnoreCase ()) .withIgnorePaths ("firstName", "seatNumber"); דוגמא לדוגמא = Example.of (Passenger.from (null, "b", null), ignoringExampleMatcher); רשימת הנוסעים = repository.findAll (דוגמה); טוענים כי (נוסעים, מכיל (פרד, ריקי)); assertThat (נוסעים, לא (מכיל (jill)); assertThat (נוסעים, לא (מכיל (ערב)); assertThat (נוסעים, לא (מכיל (siya));}

7. מסקנה

במאמר זה הוכחנו כיצד להשתמש ב- Query by API לדוגמה.

הדגמנו כיצד להשתמש דוגמא ו דוגמה התאמה ביחד איתי QueryByExampleExecutor ממשק לשאילתת טבלה באמצעות מופע נתונים לדוגמא.

לסיכום, אתה יכול למצוא את הקוד ב- GitHub.


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