הגבלת תוצאות השאילתות עם JPA ו- Spring Data JPA

1. הקדמה

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

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

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

בואו נתחיל!

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

להלן יש לנו את הטבלה שנשאיל לאורך מאמר זה.

השאלה עליה אנו רוצים לענות היא: "מהו המושב הכבוש הראשון ומי כובש אותו?".

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

3. ה- SQL

בעזרת SQL אנו עשויים לכתוב שאילתה שנראית בערך כך:

בחר שם פרטי, שם משפחה, מספר מושב מאת הנוסעים סדר לפי מושב מספר מגבלה 1;

4. הגדרת JPA

עם JPA, אנו זקוקים תחילה לישות כדי למפות את הטבלה שלנו:

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

בשלב הבא אנו זקוקים לשיטה העוטפת את קוד השאילתה שלנו, המיושמת כאן כ- PassengerRepositoryImpl # findOrderedBySeatNumberLimitedTo (מגבלת int):

מחלקה @ מאגר PassengerRepositoryImpl {@PersistenceContext פרטי EntityManager entityManager; @ רשימת רישום ציבורית @ findOrderedBySeatNumberLimitedTo (מגבלת int) {return entityManager.createQuery ("בחר p מתוך נוסע p סדר לפי p.seatNumber", Passenger.class). SetMaxResults (limit) .getResultList (); }}

בשיטת המאגר שלנו אנו משתמשים ב- EntityManager ליצור שאילתא עליו אנו מכנים setMaxResults () שיטה.

הקריאה הזו ל שאילתה # setMaxResults בסופו של דבר יביא הצהרת הגבול המצורפת ל- SQL שנוצר:

בחר נוסע 0_.id כ- id1_15_, נוסע 0_.fist_name כ- fist_nam2_15_, נוסע 0_. last_name כמו last_nam3_15_, נוסע 0_. מושב_מספר כמושב_ מספר 4_15_ מהנוסע לנוסע 0_ לפי סדר נוסע 0_. מושב_מספר מספר?

5. עם JPA Data Data

אנו יכולים גם ליצור את ה- SQL שלנו באמצעות Spring Data JPA.

5.1. ראשון אוֹ חלק עליון

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

אנו יכולים, כאופציה, לציין מספר כגודל התוצאה המקסימלי שיוחזר. אם נשמיט את זה, Spring Data JPA מניח את גודל התוצאה 1.

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

נוסע findFirstByOrderBySeatNumberAsc (); הנוסע findTopByOrderBySeatNumberAsc ();

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

FindFirstByOrderBySeatNumberAsc () אופציונלי; FindTopByOrderBySeatNumberAsc () אופציונלי;

5.2. תומכי

לחלופין, אנו יכולים להשתמש ב- תומכי לְהִתְנַגֵד:

דף דף = repository.findAll (PageRequest.of (0, 1, Sort.by (Sort.Direction.ASC, "seatNumber")));

אם נסתכל על יישום ברירת המחדל של מאגר Jpa, ה SimpleJpaRepository, אנחנו יכולים לראות שזה גם קורא שאילתה # setMaxResults:

דף מוגן readPage (שאילתת TypedQuery, Domain domainClass, Pageable pageable, @Nullable Specification Specification) {if (pageable.isPaged ()) {query.setFirstResult ((int) pageable.getOffset ()); query.setMaxResults (pageable.getPageSize ()); } להחזיר PageableExecutionUtils.getPage (query.getResultList (), pageable, () -> {return executeCountQuery (this.getCountQuery (spec, domainClass));}); }

5.3. השוואה

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

בחר נוסע 0_.id כ id1_15_, נוסע 0_.fist_name כ fist_nam2_15_, נוסע 0_. last_name כמו last_nam3_15_, נוסע 0_. מושב_מספר כמושב_ מספר 4_15_ מהנוסע הנוסע 0_ לפי סדר נוסע מגבלת עליית נוסע 0.

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

6. מסקנה

הגבלת תוצאות השאילתות ב- JPA שונה במקצת מ- SQL - איננו כוללים את מילת המפתח המגבילה ישירות ל- JPQL שלנו.

במקום זאת, אנו רק קוראים שיטה אחת שאילתה # maxResults או לכלול את מילת המפתח ראשון אוֹ חלק עליון בשם שיטת ה- Spring Data JPA שלנו.

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


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