עימוד תרדמה

1. סקירה כללית

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

2. עימוד עם HQL ו- setFirstResult,setMaxResults ממשק API

הדרך הפשוטה והנפוצה ביותר לעשות עימוד ב'ה שינה 'היא באמצעות HQL:

מושב מושב = sessionFactory.openSession (); שאילתת שאילתות = sess.createQuery ("מאת Foo"); query.setFirstResult (0); query.setMaxResults (10); רשימת fooList = fooList = query.list ();

דוגמה זו היא שימוש בסיסי פו ישות ודומה מאוד ל- JPA עם יישום JQL - ההבדל היחיד הוא שפת השאילתה.

אם נדלק כניסה למצב שינה, נראה את הפעלת ה- SQL הבא:

שינה: בחר foo0_.id כ- id1_1_, foo0_.name כשם2_1_ ממגבלת Foo foo0_?

2.1. הספירה הכוללת והעמוד האחרון

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

מחרוזת ספירה Q = "בחר ספירה (f.id) מ Foo f"; Query countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult ();

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

int pageSize = 10; int lastPageNumber = (int) (Math.ceil (countResults / pageSize));

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

@Test הציבור בטל givenEntitiesExist_whenRetrievingLastPage_thenCorrectSize () {int pageSize = 10; מחרוזת ספירה Q = "בחר ספירה (f.id) מ Foo f"; Query countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult (); int lastPageNumber = (int) (Math.ceil (countResults / pageSize)); שאילתה selectQuery = session.createQuery ("מאת Foo"); selectQuery.setFirstResult ((lastPageNumber - 1) * pageSize); selectQuery.setMaxResults (pageSize); רשימה lastPage = selectQuery.list (); assertThat (lastPage, hasSize (lessThan (pageSize + 1))); }

3. עימוד עם מצב שינה באמצעות HQL ו- API ScrollableResults

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

מחרוזת hql = "FROM Foo f order לפי f.name"; שאילתת שאילתה = session.createQuery (hql); int pageSize = 10; ScrollableResults resultScroll = query.scroll (ScrollMode.FORWARD_ONLY); resultScroll.first (); resultScroll.scroll (0); רשימת fooPage = Lists.newArrayList (); int i = 0; בעוד (pageSize> i ++) {fooPage.add ((Foo) resultScroll.get (0)); אם (! resultScroll.next ()) הפסקה; }

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

resultScroll.last (); int totalResults = resultScroll.getRowNumber () + 1;

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

4. עימוד במצב שינה באמצעות ממשק ה- API של קריטריונים

לבסוף, בואו נסתכל על פיתרון גמיש יותר - שימוש בקריטריונים:

קריטריונים לקריטריונים = session.createCriteria (Foo.class); criteria.setFirstResult (0); criteria.setMaxResults (pageSize); רשימת firstPage = criteria.list ();

ממשק API לשאילתת Hibernate Criteria עושה את זה פשוט מאוד גם קבל את הספירה הכוללת - באמצעות א הַקרָנָה לְהִתְנַגֵד:

קריטריונים קריטריוניםספירה = session.createCriteria (Foo.class); criteriaCount.setProjection (Projections.rowCount ()); ספירה ארוכה = (Long) criteriaCount.uniqueResult ();

כפי שאתה יכול לראות, שימוש ב- API זה יביא לקוד מילולי יותר מינימלי מאשר HQL רגיל, אך ה- API הוא בטיחותי לחלוטין והרבה יותר גמיש.

5. מסקנה

מאמר זה הוא מבוא מהיר על הדרכים השונות לעשות עימוי ב'ה שינה '.

ניתן למצוא את היישום של מדריך ה- JPA באביב הזה בפרויקט GitHub - זהו פרויקט מבוסס Eclipse, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.