מיפוי שאילתת שינה למעמד מותאם אישית

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

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

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

2. הישויות

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

@Entity מחלקה ציבורית DeptEmployee {@Id @GeneratedValue (אסטרטגיה = GenerationType.SEQUENCE) מזהה פרטי ארוך; עובד מחרוזת פרטי מספר; ייעוד מחרוזת פרטי; שם מחרוזת פרטי; מחלקת מחלקה פרטית @ManyToOne; // constructor, getters and setter} @Entity Class Class Department {@Id @GeneratedValue (אסטרטגיה = GenerationType.SEQUENCE) מזהה פרטי פרטי; שם מחרוזת פרטי; @OneToMany (mappedBy = "מחלקה") עובדים ברשימה פרטית; מחלקה ציבורית (שם מחרוזת) {this.name = שם; } // גטרים וקובעים}

הנה, יש לנו שתי ישויות - עובד המחלקה ו מַחלָקָה. למען הפשטות, נניח כי א עובד המחלקה יכול להיות שייך רק לאחד מַחלָקָה.

אבל, א מַחלָקָה יכול להיות מרובה עובדים במחלקה.

3. מחלקת תוצאות שאילתות מותאמות אישית

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

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

שאילתת שאילתות = session.createQuery ("מאת com.baeldung.hibernate.entities.DeptEmployee"); רשום deptEmployees = query.list ();

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

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

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

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

שאילתת שאילתה = session.createQuery ("בחר m.name, m.department.name מ com.baeldung.hibernate.entities.DeptEmployee m"); מנהלי רשימה = query.list (); אובייקט [] מנהל = (אובייקט []) managers.get (0); assertEquals ("ג'ון סמית ', מנהל [0]); assertEquals ("מכירות", מנהל [1]);

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

בואו נסתכל על תוֹצָאָה בכיתה בה נשתמש כדי לאכלס את הנתונים שנאספו ל:

כיתה ציבורית תוצאה {פרטי מחרוזת עובד שם; מחלקת מיתרים פרטית שם; תוצאה ציבורית (מחרוזת שם עובד, מחרוזת מחלקה) {this.employeeName = עובד שם; this.departmentName = departmentName; } תוצאה ציבורית () {} // גטרים וקובעים}

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

נראה מדוע הקונסטרוקטור חשוב בחלק הבא.

4. שימוש בבנאי ב- HQL

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

שאילתת שאילתה = session.createQuery ("בחר com.baeldung.hibernate.pojo.Result חדש (m.name, m.department.name)" + "מ com.baeldung.hibernate.entities.DeptEmployee m"); תוצאות רשימה = query.list (); תוצאת התוצאה = results.get (0); assertEquals ("ג'ון סמית", result.getEmployeeName ()); assertEquals ("מכירות", result.getDepartmentName ());

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

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

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

5. שימוש ב- ResultTransformer

חלופה לשימוש בבנאי בשאילתת HQL היא להשתמש ב- תוצאה משדר:

שאילתת שאילתה = session.createQuery ("בחר m.name בשם עובד שם, m.department.name כמחלקת שם" + "מ com.baeldung.hibernate.entities.DeptEmployee m"); query.setResultTransformer (Transformers.aliasToBean (Result.class)); תוצאות רשימה = query.list (); תוצאת התוצאה = results.get (0); assertEquals ("ג'ון סמית", result.getEmployeeName ()); assertEquals ("מכירות", result.getDepartmentName ());

אנו משתמשים ב- רוֹבּוֹטרִיקִים.aliasToBean () שיטה להשתמש בנתונים שאוחזרו כדי לאכלס את תוֹצָאָה חפצים.

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

ציין זאת Query.setResultTransformer (ResultTransformer) הוצא משימוש מאז שנת תרדמת 5.2.

6. מסקנה

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

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