שאילתות קריטריונים של JPA

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

במדריך זה נדון בתכונת JPA שימושית ביותר - שאילתות קריטריונים.

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

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

2. תלות Maven

כדי להמחיש את ה- API, נשתמש ביישום ה- JPA להפניה - Hibernate.

כדי להשתמש במצב שינה, הקפד להוסיף את הגרסה האחרונה שלו ל- pom.xml קוֹבֶץ:

 org.hibernate hibernate-core 5.3.2.סופי 

הגרסה האחרונה של Hibernate נמצאת כאן.

3. דוגמה פשוטה תוך שימוש בקריטריונים

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

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

מחלקה ציבורית מיישמת פריטים ניתן לסידור {פרטי שלם itemId; פריט מחרוזת פריט שם; פריט מחרוזת פרטי תיאור; פריט שלם פרטי מחיר; // סטרים וקובעים סטנדרטיים}

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

מושב מושב = HibernateUtil.getHibernateSession (); CriteriaBuilder cb = session.getCriteriaBuilder (); CriteriaQuery cr = cb.createQuery (Item.class); שורש שורש = cr.from (Item.class); cr.select (שורש); שאילתת שאילתה = session.createQuery (cr); תוצאות רשימה = query.getResultList ();

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

  1. צור מופע של מוֹשָׁב מ ה SessionFactory לְהִתְנַגֵד
  2. צור מופע של CriteriaBuilder על ידי קריאה ל getCriteriaBuilder () שיטה
  3. צור מופע של CriteriaQuery על ידי קריאה ל CriteriaBuilderשיטת createQuery ()
  4. צור מופע של שאילתא על ידי קריאה ל מוֹשָׁבcreateQuery () שיטה
  5. תתקשר ל getResultList () שיטת ה- שאילתא אובייקט אשר נותן לנו את התוצאות

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

3.1. באמצעות ביטויים

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

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

כדי להשיג פריטים שמחירם עולה על 1000:

cr.select (root) .where (cb.gt (root.get ("itemPrice"), 1000));

לאחר מכן, להשיג פריטים שיש מחיר מוצר פחות מ 1000:

cr.select (root) .where (cb.lt (root.get ("itemPrice"), 1000));

פריטים שיש פריט שמות לְהַכִיל כִּסֵא:

cr.select (root) .where (cb.like (root.get ("itemName"), "% chair%"));

רשומות שיש מחיר מוצר בין 100 ל 200:

cr.select (root) .where (cb.between (root.get ("itemPrice"), 100, 200));

כדי לבדוק אם הנכס הנתון הוא ריק:

cr.select (root) .where (cb.isNull (root.get ("itemDescription")));

כדי לבדוק אם הנכס הנתון אינו ריק:

cr.select (root) .where (cb.isNotNull (root.get ("itemDescription")));

אתה יכול גם להשתמש בשיטות זה ריק() ו זה לא ריק() לבדוק אם א רשימה בתוך כיתה ריק או לא.

כעת באופן בלתי נמנע נשאלת השאלה, האם נוכל לשלב שתיים או יותר מההשוואות הנ"ל או לא. התשובה היא, כמובן, כן - ממשק ה- API של קריטריונים מאפשר לנו לשרשר ביטויים בקלות:

חזות [] predicates = חדש Predicate [2]; predicates [0] = cb.isNull (root.get ("itemDescription")); predicates [1] = cb.like (root.get ("itemName"), "כסא%"); cr.select (שורש). Where (predicates);

כדי להוסיף שני ביטויים עם פעולות לוגיות:

לחזות ל - greaterThanPrice = cb.gt (root.get ("itemPrice"), 1000); Predicate chairItems = cb.like (root.get ("itemName"), "Chair%");

פריטים עם התנאים שהוגדרו לעיל הצטרפו אליהם הגיוני או:

cr.select (root) .where (cb.or (greaterThanPrice, chairItems));

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

cr.select (root) .where (cb.and (greaterThanPrice, chairItems));

3.2. מִיוּן

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

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

cr.orderBy (cb.asc (root.get ("itemName")), cb.desc (root.get ("itemPrice")));

בחלק הבא נבחן כיצד לבצע פונקציות מצטברות.

3.3. תחזיות, צבירות ופונקציות קיבוץ

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

קבל ספירת שורות:

CriteriaQuery cr = cb.createQuery (Long.class); שורש שורש = cr.from (Item.class); cr.select (cb.count (root)); שאילתת שאילתה = session.createQuery (cr); פריט רשימהProjected = query.getResultList ();

להלן דוגמה לפונקציות מצטברות:

לְקַבֵּץ פונקציה עבור מְמוּצָע:

CriteriaQuery cr = cb.createQuery (Double.class); שורש שורש = cr.from (Item.class); cr.select (cb.avg (root.get ("itemPrice"))); שאילתת שאילתה = session.createQuery (cr); רשימה avgItemPriceList = query.getResultList ();

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

3.4. קריטריונים עדכון

החל מ- JPA 2.1, יש תמיכה בביצוע עדכוני מסדי נתונים באמצעות ה- קריטריונים ממשק API.

קריטריונים עדכון יש מַעֲרֶכֶת() שיטה שבה ניתן להשתמש כדי לספק ערכים חדשים עבור רשומות מסדי נתונים:

CriteriaUpdate criteriaUpdate = cb.createCriteriaUpdate (Item.class); שורש שורש = criteriaUpdate.from (Item.class); criteriaUpdate.set ("itemPrice", newPrice); criteriaUpdate.where (cb.equal (root.get ("itemPrice"), oldPrice)); עסקת עסקה = session.beginTransaction (); session.createQuery (criteriaUpdate) .executeUpdate (); transaction.commit ();

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

3.5. מחק

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

קריטריונים מחק קריטריונים מחק = cb.createCriteriaDelete (Item.class); שורש שורש = criteriaDelete.from (Item.class); criteriaDelete.where (cb.greaterThan (root.get ("itemPrice"), targetPrice)); עסקת עסקה = session.beginTransaction (); session.createQuery (criteriaDelete) .executeUpdate (); transaction.commit ();

4. יתרון על פני HQL

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

בְּבִירוּר, היתרון העיקרי והקשה ביותר של שאילתות קריטריונים על פני HQL הוא ממשק ה- API נחמד, נקי, מונחה עצמים.

אנו יכולים פשוט לכתוב שאילתות גמישות ודינמיות יותר בהשוואה ל- HQL רגיל. ניתן לשחזר את ההיגיון באמצעות ה- IDE ויש לו את כל היתרונות הבטיחותיים של שפת Java עצמה.

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

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

5. מסקנה

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

הקוד הנדון כאן זמין במאגר Github.