מיון עם JPA

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

מאמר זה ממחיש את הדרך השונה ניתן להשתמש ב- JPA למיון.

2. מיון באמצעות JPA / JQL API

השימוש ב- JQL למיון נעשה בעזרת ה- מיין לפי סָעִיף:

מחרוזת jql; שאילתת שאילתות = entityManager.createQuery (jql);

בהתבסס על שאילתה זו, JPA מייצר את הקהל הבא הצהרת SQL:

שינה: בחר foo0_.id כ- id1_4_, foo0_.name כשם2_4_ מ- Foo foo0_ סדר לפי foo0_.id

שים לב שמילות המפתח של SQL במחרוזת JQL אינן רגישות לאותיות רישיות, אך שמות הגופים ותכונותיהם הם.

2.1. קביעת סדר המיון

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

מחרוזת jql = "בחר f מ Foo כסדר f לפי f.id desc"; שאילתה sortQuery = entityManager.createQuery (jql);

ה שאילתת SQL שנוצרה יכלול את כיוון ההזמנה:

מצב שינה: בחר foo0_.id כ- id1_4_, foo0_.name כשם2_4_ מתוך Foo foo0_ סדר לפי foo0_.id desc

2.2. מיון לפי מאפיין יותר מאחד

למיון לפי תכונות מרובות, אלה מתווספים ל- oרדר על ידי סעיף מחרוזת JQL:

מחרוזת jql; שאילתה sortQuery = entityManager.createQuery (jql);

שני תנאי המיון יופיעו ב שאילתת SQL שנוצרה הַצהָרָה:

מצב שינה: בחר foo0_.id כ- id1_4_, foo0_.name כשם2_4_ מתוך Foo foo0_ סדר לפי foo0_.name asc, foo0_.id desc

2.3. הגדרת עדיפות מיון של ערכים אפסיים

עדיפות ברירת המחדל של אפסים היא ספציפית למסד נתונים, אך ניתן להתאמה אישית באמצעות אפסים ראשונים אוֹ אפסים אחרונים סעיף במחרוזת שאילתת HQL.

הנה דוגמה פשוטה - הזמנה לפי שֵׁם שֶׁל פו בסדר יורד ובהצבה ריקבסוף:

Query sortQuery = entityManager.createQuery ("בחר f מ Foo כסדר f לפי f.name desc NULLS LAST");

שאילתת SQL שנוצרת כוללת את הוא null סעיף 1 אחר 0 (שורה 3):

שינה: בחר foo0_.id בתור id1_4_, foo0_.BAR_ID כ- BAR_ID2_4_, foo0_.bar_Id כמו bar_Id2_4_, foo0_.name כשם 3_4_, מ- Foo foo0_ סדר לפי מקרה כאשר foo0_.name הוא ריק ואז 1 אחר 0 end, foo0

2.4. מיון יחסים מרובים

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

אנחנו רוצים למיין את בָּר ישויות וגם אוסף שלהם פו ישויות - JPA פשוט במיוחד למשימה זו:

  1. מיון האוסף: הוסף מיין לפי ביאור שקדם ל פו אוסף ב בָּר יֵשׁוּת:
    @OrderBy ("שם ASC") רשימת fooList;
  2. מיון היישות המכילה את האוסף:
    מחרוזת jql = "בחר b מבר כסדר b על ידי b.id"; שאילתה barQuery = entityManager.createQuery (jql); רשימה barList = barQuery.getResultList ();

שים לב שה- @מיין לפי ביאור הוא אופציונלי, אך אנו משתמשים בו במקרה זה מכיוון שאנו רוצים למיין את פו אוסף של כל אחד בָּר.

בואו נסתכל על שאילתת SQL נשלח ל- RDMS:

שינה: בחר bar0_.id כ- id1_0_, bar0_.name כשם2_0_ מסרגל bar0_ סדר לפי bar0_.id שינה: בחר שוטה0_.BAR_ID כ- BAR_ID2_0_0_, טיפש0_.היה id1_4_0_, טיפש0_.יד כמו id1_4_1_ .bar_Id כמו bar_Id2_4_1_, foolist0_.name כשם3_4_1_ מ- Foo foolist0_ איפה שוטה0_.BAR_ID =? סדר לפי שוטה0_.name asc 

השאילתה הראשונה ממיינת את ההורה בָּר יֵשׁוּת. השאילתה השנייה נוצרת כדי למיין את אוסף הילד פו גופים השייכים ל בָּר.

3. מיון באמצעות JPA Criteria Query Object API

עם קריטריונים של JPA - מיין לפי השיטה היא חלופה "עצירה אחת" להגדרת כל פרמטרי המיון: שניהם הזמנת כיוון וה תכונות למיון ניתן להגדיר על ידי. להלן ממשק ה- API של השיטה:

  • מיין לפי(CriteriaBuilder.asc): ממיין בסדר עולה.
  • מיין לפי(CriteriaBuilder.desc): ממיין בסדר יורד.

כל אחד להזמין מופע נוצר באמצעות ה- CriteriaBuilder חפץ דרך שלה עלייה אוֹ ירידה שיטות.

הנה דוגמה מהירה - מיון פוס על ידי שלהם שֵׁם:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); שורש מ = criteriaQuery.from (Foo.class); בחר CriteriaQuery = criteriaQuery.select (מ); criteriaQuery.orderBy (criteriaBuilder.asc (from.get ("שם")));

הטיעון ל geשיטת t אינה תלויה באותיות רישיות, מכיוון שהיא צריכה להתאים לשם התכונה.

בניגוד ל- JQL פשוט, ה- JPA Criteria Query Object API מכריח כיוון סדר מפורש בשאילתה. שים לב בשורה האחרונה של קטע הקוד הזה ש- criteriaBuilder האובייקט מציין את סדר המיון שיש לעלות באמצעות קריאה שלו עלייה שיטה.

כאשר הקוד לעיל מבוצע, JPA מייצר את שאילתת SQL המוצגת להלן. JPA Criteria Object יוצר משפט SQL עם מפורש עלייה סָעִיף:

שינה: בחר foo0_.id כ- id1_4_, foo0_.name כשם2_4_ מ- Foo foo0_ סדר לפי foo0_.name asc

3.1. מיון לפי מאפיין יותר מאחד

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

הנה דוגמה מהירה - מיון לפי שֵׁם ו תְעוּדַת זֶהוּת, ב עלייה ו ירידה סדר, בהתאמה:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); שורש מ = criteriaQuery.from (Foo.class); בחר CriteriaQuery = criteriaQuery.select (מ); criteriaQuery.orderBy (criteriaBuilder.asc (from.get ("שם")), criteriaBuilder.desc (from.get ("id")));

שאילתת SQL המתאימה מוצגת להלן:

מצב שינה: בחר foo0_.id כ- id1_4_, foo0_.name כשם2_4_ מ- Foo foo0_ סדר לפי foo0_.name asc, foo0_.id desc

4. מסקנה

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

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


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