מדריך Querydsl עם JPA

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

Querydsl היא מסגרת Java רחבה, המסייעת ליצירה והפעלה שאילתות בטיחות סוג בשפה ספציפית לתחום הדומה ל- SQL.

במאמר זה נחקור את Querydsl באמצעות ממשק ה- API של Java Persistence.

הערה צדדית מהירה כאן היא כי HQL עבור Hibernate הייתה שפת היעד הראשונה עבור Querydsl, אך כיום היא תומכת ב- JPA, JDO, JDBC, Lucene, Search Hibernate, MongoDB, Collections ו- RDFBean כ- backends.

2. הכנות

ראשית נוסיף את התלות הדרושה לפרויקט Maven שלנו:

 2.5.0 com.querydsl querydsl-apt $ {querydsl.version} סיפק com.querydsl querydsl-jpa $ {querydsl.version} org.slf4j slf4j-log4j12 1.6.1 

ועכשיו בואו להגדיר את התוסף Maven APT:

   ... com.mysema.maven apt-maven-plugin 1.1.3 יעד תהליך / מקורות שנוצרו com.querydsl.apt.jpa.JPAAnnotationProcessor ... 

ה JPAAnnotationProcessor ימצא סוגי דומיינים עם רישום javax. התמדה. ישות ביאור ויוצר עבורם סוגי שאילתות.

3. שאילתות עם Querydsl

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

נתיבי השאילתות והפעולות זהים בכל היישומים וגם ב שאילתא לממשקים יש ממשק בסיס משותף.

3.1. ישות וסוג השאילתות Querydsl

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

אדם בכיתה ציבורית @Entity {@Id @GeneratedValue (אסטרטגיה = GenerationType.IDENTITY) פרטי מזהה ארוך; שם פרטי @Column פרטי מחרוזת; שם משפחה פרטי מחרוזת @ טור; אדם () {} אדם ציבורי (שם מחרוזת, שם משפחה מחרוזת) {this.firstname = שם פרטי; this.surname = שם משפחה; } // גטרים וקובעים סטנדרטיים}

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

ראשון - QPerson יש משתנה מופע ברירת מחדל אליו ניתן לגשת כשדה סטטי:

אדם QPerson = QPerson.person;

לחלופין תוכלו להגדיר משלכם אדם משתנים כמו זה:

אדם QPerson = QPerson חדש ("Erich", "Gamma");

3.2. בנה שאילתה באמצעות JPAQuery

כעת אנו יכולים להשתמש JPAQuery מקרים לשאילתות שלנו:

שאילתת JPAQuery = JPAQuery חדשה (entityManager);

שים לב שה- entityManager הוא JPA EntityManager.

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

אדם QPerson = QPerson.person; רשימת אנשים = query.from (person) .where (person.firstName.eq ("Kent")). List (person);

ה מ call מגדיר את מקור השאילתה וההקרנה, את איפה החלק מגדיר את המסנן ו- רשימה אומר ל- Querydsl להחזיר את כל האלמנטים המותאמים.

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

query.from (person) .where (person.firstName.eq ("Kent"), person.sname.eq ("Beck"));

אוֹ:

query.from (person) .where (person.firstName.eq ("Kent"). ו- (person.sname.eq ("Beck")));

בטופס JPQL מקורי השאילתה תיכתב כך:

בחר אדם מאדם כאדם שבו person.firstName = "קנט" ו- person.sname = "בק"

אם ברצונך לשלב את המסננים באמצעות "או", השתמש בדפוס הבא:

query.from (person) .where (person.firstName.eq ("Kent"). or (person.sname.eq ("Beck")));

4. הזמנה וצבירה בקווירדל

בואו נסתכל כיצד הסדר והצבירה עובדים בספריית Querydsl.

4.1. מזמין

נתחיל בהזמנת התוצאות בסדר יורד לפי ה- שֵׁם מִשׁפָּחָה שדה:

אדם QPerson = QPerson.person; רשימת אנשים = query.from (person) .where (person.firstname.eq (firstname)) .orderBy (person.sname.desc ()) .list (person);

4.2. צבירה

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

אדם QPerson = QPerson.person; int maxAge = query.from (person) .list (person.age.max ()). get (0);

4.3. צבירה עם GroupBy

ה com.mysema.query.group.GroupBy class מספק פונקציונליות צבירה בה אנו יכולים להשתמש כדי לצבור תוצאות שאילתות בזיכרון.

הנה דוגמה מהירה שבה התוצאה מוחזרת כ מַפָּה עם שם פרטי כמפתח ו גיל מקסימלי כערך:

אדם QPerson = QPerson.person; תוצאות מפה = query.from (person) .transform (GroupBy.groupBy (person.firstname) .as (GroupBy.max (person.age)));

5. בדיקה עם Querydsl

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

רשימה ציבורית findPersonsByFirstnameQuerydsl (שם מחרוזת) {JPAQuery query = new JPAQuery (em); אדם QPerson = QPerson.person; החזר query.from (person) .where (person.firstname.eq (firstname)). list (person); }

ועכשיו בואו נבנה כמה בדיקות באמצעות ה- DAO החדש הזה ובואו נשתמש ב- Querydsl לחיפוש אחר החדש שנוצר אדם אובייקטים (מיושמים ב PersonDao בכיתה) ובצבירת בדיקות אחרת באמצעות GroupBy הכיתה נבדקת:

@ PersonDao פרטי אישי מאושר; @ מבחן הריק פומבי שניתןExistingPersons_whenFindingPersonByFirstName_thenFound () {personDao.save (אדם חדש ("Erich", "Gamma")); אדם אדם = אדם חדש ("קנט", "בק"); personDao.save (אדם); personDao.save (אדם חדש ("ראלף", "ג'ונסון")); אדם personFromDb = personDao.findPersonsByFirstnameQuerydsl ("קנט"). Get (0); Assert.assertEquals (person.getId (), personFromDb.getId ()); } @Test הציבור בטל שניתןExistingPersons_whenFindingMaxAgeByName_thenFound () {personDao.save (אדם חדש ("קנט", "גמא", 20)); personDao.save (אדם חדש ("ראלף", "ג'ונסון", 35)); personDao.save (אדם חדש ("קנט", "זיוואגו", 30)); מפה maxAge = personDao.findMaxAgeByName (); Assert.assertTrue (maxAge.size () == 2); Assert.assertSame (35, maxAge.get ("ראלף")); Assert.assertSame (30, maxAge.get ("קנט")); }

6. מסקנה

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

ה יישום מלא של מאמר זה ניתן למצוא בפרויקט github - זהו פרויקט maven מבוסס Eclipse, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.

הערה מהירה כאן היא - הפעל מבנה פשוט של maven (mvn clean install) כדי ליצור את הסוגים לתוכו מטרה / מקורות שנוצרו ואז, אם אתה משתמש ב- Eclipse - כלול את התיקיה כתיקיית מקור של הפרויקט.


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