עימוד תרדמה
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, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.