תחזיות JPA / Hibernate

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

במדריך זה נלמד כיצד להקרין מאפייני ישויות באמצעות JPA ו- Hibernate.

2. הישות

ראשית, בואו נסתכל על הישות בה נשתמש לאורך מאמר זה:

מוצר מחלקה ציבורית @Entity {@ Id מזהה פרטי פרטי; שם מחרוזת פרטי; תיאור מחרוזת פרטי; קטגוריית מחרוזת פרטית; יחידת BigDecimal פרטית; // סטרים וגטררים}

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

3. תחזיות JPA

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

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

אבל, אפשר אחזר קבוצת משנה של מאפייני הישות, או, כלומר, א הַקרָנָה של נתוני עמודות.

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

3.1. תחזיות עמוד יחיד

נניח שנרצה לרשום את שמות כל המוצרים. ב- JPQL נוכל לעשות זאת על ידי הכללת רק את ה- שֵׁם בתוך ה בחר סָעִיף:

שאילתת שאילתה = entityManager.createQuery ("בחר שם ממוצר"); רשימת resultList = query.getResultList ();

או, אנחנו יכולים לעשות את אותו הדבר גם עם CriteriaBuilder:

בונה CriteriaBuilder = entityManager.getCriteriaBuilder (); שאילתת CriteriaQuery = builder.createQuery (String.class); מוצר שורש = query.from (Product.class); query.select (product.get ("שם")); רשימת resultList = entityManager.createQuery (שאילתה) .getResultList ();

כי אנחנו מקרינים טור אחד שבמקרה הוא מסוג חוּט, אנו מצפים לקבל רשימה של חוּטס בתוצאה. לפיכך ציינו את מחלקת המועמדים כ- חוּט בתוך ה createQuery () שיטה.

מכיוון שאנחנו רוצים להקרין על נכס יחיד, השתמשנו ב- Query.select () שיטה. מה שקורה כאן הוא איזה נכס אנחנו רוצים, ולכן במקרה שלנו נשתמש ב שֵׁם נכס משלנו מוצר יֵשׁוּת.

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

שם מוצר 1 שם מוצר 2 שם מוצר 3 שם מוצר 4

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

3.2. תחזיות מרובות עמודות

כדי להקרין מספר עמודות באמצעות JPQL, עלינו רק להוסיף את כל העמודות הנדרשות ל- בחר סָעִיף:

שאילתת שאילתה = session.createQuery ("בחר מזהה, שם, יחידה מחיר ממוצר"); רשימת resultList = query.getResultList ();

אבל, כאשר משתמשים ב- CriteriaBuilderנצטרך לעשות דברים קצת אחרת:

בונה CriteriaBuilder = session.getCriteriaBuilder (); שאילתת CriteriaQuery = builder.createQuery (Object []. Class); מוצר שורש = query.from (Product.class); query.multiselect (product.get ("id"), product.get ("name"), product.get ("unitPrice")); רשימת resultList = entityManager.createQuery (שאילתה) .getResultList ();

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

שינוי משמעותי נוסף הוא השימוש ב לְהִתְנַגֵד[]. כשאנחנו בוחרים מספר פריטים, השאילתה מחזירה מערך אובייקטים עם ערך לכל פריט שמוקרן. זה המקרה גם עם JPQL.

בואו נראה איך הנתונים נראים כשאנחנו מדפיסים אותם:

[1, שם מוצר 1, 1.40] [2, שם מוצר 2, 4.30] [3, שם מוצר 3, 14.00] [4, שם מוצר 4, 3.90]

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

כמו כן, אנו יכולים להשתמש CriteriaBuilder.tuple () אוֹ CriteriaBuilder.construct () כדי לקבל את התוצאות כרשימה של טופל אובייקטים או אובייקטים ממעמד מותאם אישית בהתאמה.

3.3. הקרנת פונקציות צבירות

מלבד נתוני עמודות, ייתכן שנרצה לקבץ את הנתונים ולהשתמש בפונקציות מצטברות, כמו לספור ו מְמוּצָע.

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

שאילתת שאילתה = entityManager.createQuery ("בחר קטגוריה p, ספירה (p) מקבוצת p מוצרים לפי p.category");

או שאנחנו יכולים להשתמש CriteriaBuilder:

בונה CriteriaBuilder = entityManager.getCriteriaBuilder (); שאילתת CriteriaQuery = builder.createQuery (Object []. Class); מוצר שורש = query.from (Product.class); query.multiselect (product.get ("קטגוריה"), builder.count (מוצר)); query.groupBy (product.get ("קטגוריה"));

הנה, השתמשנו CriteriaBuilderשל לספור() שיטה.

שימוש באחד מהאמור לעיל יפיק רשימה של מערכי אובייקטים:

[קטגוריה 1, 2] [קטגוריה 2, 1] [קטגוריה 3, 1]

חוץ מ לספור(), CriteriaBuilder מספק פונקציות מצטברות אחרות:

  • ממוצע - מחשבת את הערך הממוצע עבור עמודה בקבוצה
  • מקסימום - מחשבת את הערך המקסימלי עבור עמודה בקבוצה
  • דקה - מחשבת את הערך המינימלי לעמודה בקבוצה
  • הכי פחות - מוצא את הערכים הנמוכים ביותר מבין העמודות (למשל, באלף בית או לפי תאריך)
  • סְכוּם - מחשבת את סכום ערכי העמודות בקבוצה

4. תחזיות שינה

בניגוד ל- JPA, Hibernate מספק org.hibernate.criterion.Projection להקרנה עם א קריטריונים שאילתא. זה גם מספק שיעור שנקרא org.hibernate.criterion.Projections, מפעל עבור הַקרָנָה מקרים.

4.1. תחזיות עמוד יחיד

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

קריטריונים לקריטריונים = session.createCriteria (Product.class); קריטריונים = criteria.setProjection (Projections.property ("שם")); 

השתמשנו ב- Criteria.setProjection () שיטה כדי לציין את המאפיין הרצוי בתוצאת השאילתה. Projections.property () עושה את אותה העבודה עבורנו כמו Root.get () עשה כאשר מציינים את העמודה לבחירה.

4.2. תחזיות מרובות עמודות

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

אנחנו יכולים ליצור רשימת הקרנהמשתמש ב Projections.projectionList () שיטה, כמו להראות את מוצרשל תְעוּדַת זֶהוּת ו שֵׁם:

קריטריונים לקריטריונים = session.createCriteria (Product.class); קריטריונים = criteria.setProjection (Projections.projectionList () .add (Projections.id ()) .add (Projections.property ("שם")));

4.3. הקרנת פונקציות צבירות

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

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

קריטריונים לקריטריונים = session.createCriteria (Product.class); קריטריונים = criteria.setProjection (Projections.projectionList () .add (Projections.groupProperty ("קטגוריה")) .add (Projections.rowCount ()));

חשוב לציין זאת לא ציינו ישירות את GROUP BY במערכת קריטריונים לְהִתְנַגֵד. יִעוּד groupProperty מעורר זאת עבורנו.

חוץ מ rowCount () פוּנקצִיָה, הקרנות מספק גם את הפונקציות המצטברות שראינו קודם.

4.4. שימוש בכינוי להקרנה

מאפיין מעניין של ה- Hibernate Criteria API הוא השימוש בכינוי להקרנה.

זה שימושי במיוחד כאשר משתמשים בפונקציה צבירה, מכיוון שאנו יכולים להתייחס לכינוי ב- קרִיטֶרִיוֹן ו להזמין מקרים:

קריטריונים לקריטריונים = session.createCriteria (Product.class); קריטריונים = criteria.setProjection (Projections.projectionList () .add (Projections.groupProperty ("קטגוריה")) .add (Projections.alias (Projections.rowCount (), "ספירה"))); criteria.addOrder (Order.asc ("ספירה"));

5. מסקנה

במאמר זה ראינו כיצד להקרין מאפייני ישויות באמצעות JPA ו- Hibernate.

חשוב לציין ש Hibernate ביטל את ה- Criteria API שלו מגרסה 5.2 ואילך לטובת ה- JPA CriteriaQuery API. אבל זה רק בגלל שצוות ה- Hibernate אין את הזמן לשמור על שני ממשקי API שונים, שהם פחות או יותר עושים את אותו הדבר בסינכרון.

וכמובן, ניתן למצוא את הקוד המשמש במאמר זה ב- GitHub.


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