שאילתות ישויות לפי תאריכים וזמנים עם JPA של Spring Data

1. הקדמה

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

ראשית נרענן את זיכרוננו לגבי אופן מיפוי תאריכים ושעות באמצעות JPA.

לאחר מכן ניצור ישות עם שדות תאריך ושעה וכן מאגר נתונים של Spring כדי לשאול אותם ישויות.

2. מיפוי תאריכים וזמנים עם JPA

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

  • תאריך בלבד
  • זמן בלבד
  • או שניהם

בנוסף ל (אופציונלי) @טור ביאור, נצטרך להוסיף את @זְמַנִי ביאור כדי לציין מה מייצג השדה.

ביאור זה לוקח פרמטר שהוא ערך של TemporalType enum:

  • TemporalType.DATE
  • TemporalType.TIME
  • TemporalType.TIMESTAMP

מאמר מפורט אודות מיפוי תאריכים ושעות עם JPA ניתן למצוא כאן.

3. בפועל

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

כל מנגנון JPA של Spring Data יעבוד בסדר גמור.

בואו נראה כמה דוגמאות של ישויות שנחקרו לפי תאריכים ושעות עם Spring Data JPA.

3.1. הגדר ישות

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

מאמר בכיתה ציבורית @Entity {@Id @GeneratedValue מזהה שלם; @Temporal (TemporalType.DATE) תאריך פרסום תאריך; @Temporal (TemporalType.TIME) פרסום תאריך זמן; @Temporal (TemporalType.TIMESTAMP) יצירת תאריך DateTime; }

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

3.2. שאל את הישויות

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

ניצור שלוש שיטות, תוך שימוש במספר תכונות JPA של Spring Data:

ממשק ציבורי ArticleRepository מרחיב את JpaRepository {List findAllByPublicationDate (תאריך פרסום תאריך); רשימה findAllByPublicationTimeBetween (תאריך פרסום זמן התחלה, תאריך פרסום זמן סיום); @Query ("בחר מתוך מאמר a שבו a.creationDateTime <=: creationDateTime") רשימה findAllWithCreationDateTimeBefore (@Param ("creationDateTime") Creation DateDateTime); }

אז הגדרנו שלוש שיטות:

  • findAllByPublicationDate שמאחזר מאמרים שפורסמו בתאריך מסוים
  • findAllByPublicationTimeBetween שמאחזר מאמרים שפורסמו בין שעתיים נתונות
  • ו findAllWithCreationDateTimeBefore שמאחזר מאמרים שנוצרו לפני תאריך ושעה מסוימים

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

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

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

3.3. בדוק את השאילתות

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

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

@RunWith (SpringRunner.class) @DataJpaTest מחלקה ציבורית ArticleRepositoryIntegrationTest {@ מאגר פרטי ArticleRepository פרטי; @Test הציבור בטל כאשר FindByPublicationDate_thenArticles1And2Returned () {List result = repository.findAllByPublicationDate (SimpleDateFormat חדש ("yyyy-MM-dd"). ניתוח ("01/01/2018")); assertEquals (2, result.size ()); assertTrue (result.stream () .map (Article :: getId) .allMatch (id -> Arrays.asList (1, 2) .contains (id))); } @Test ציבורי בטל כאשר FindByPublicationTimeBetween_thenArticles2And3Returned () {List result = repository.findAllByPublicationTimeBetween (SimpleDateFormat חדש ("HH: mm"). ניתוח ("15:15"), SimpleDateFormat חדש ("HH:") " 30 ")); assertEquals (2, result.size ()); assertTrue (result.stream () .map (Article :: getId) .allMatch (id -> Arrays.asList (2, 3) .contains (id))); } @Test ציבורי בטל שניתןArticlesWhenFindWithCreationDateThenArticles2And3Returned () {List result = repository.findAllWithCreationDateTimeBefore (חדש SimpleDateFormat ("yyyy-MM-dd HH: mm"). ניתוח ("2017-12-15 10:00")); assertEquals (2, result.size ()); assertTrue (result.stream () .map (Article :: getId) .allMatch (id -> Arrays.asList (2, 3) .contains (id));}}

כל בדיקה מאמתת כי רק המאמרים התואמים לתנאים מתקבלים.

4. מסקנה

במאמר קצר זה, ראינו כיצד לבצע שאילתות על ישויות תוך שימוש בשדות התאריכים והשעות שלהם באמצעות Spring Data JPA.

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

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