שנה נתוני JSON ב-PGSQL וב-Hibernate 6

זה מאמר נוסף בסדרה שקשורה לתמיכה ב פונקציות JSON בPostgres בפרוייקט שמשתמש בשרשרת Hibernate עם הגירסה 6. הנושא של המאמר הוא פעולות העריכה על רשימות JSON. כמו במאמר הקודם, עלי לציין שPostgres עשוי להיות עכשיו ללא פעולות כה מורחבות כמו במסדרונות NoSQL אחרים כמו MongoDB לעריכת רשימות JSON (למרות זאת, עם היצירה הנכונה של פונקציות, אפשר להשיג את אותו האפקט). עדיין, זה מתאים לרוב הפרוייקטים שצריכים עריכת רשימות JSON. בנוסף, עם תמיכה בעסקה (שאינה קיימת במסדרון NoSQL ברמה כזאת), זה רעיון די טוב להשתמש בPostgres עם מידע JSON. כמובן, מסדרונות NoSQL מערכים ברמה אחרת שאולי טובים יותר עבור פרוייקטים.

ישנם בדרך כלל הרבה מאמרים על התמיכה בJSON בPostgres. המאמר הזה מתמקד בהתאמה הזו עם הספרה 6 של Hibernate.

במקרה שמישהו מעוניין בשאילת מידע JSON או חיפוש טקסט בעזרת Postgres וHibernate, הייתם מוזמנים לראות את הקישורים הבאים:

נתוני בדיקה

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

SQL

 

אולי יש לנו גם נתונים בדיקה:

SQL

 

ביצוע מסוגלים SQL מקומי

כמו במערכות הג'אva האחרות בJava, אתם יכולים לבצע שאלות SQL מקומיות — שנועדו ופורסם טוב ויש המון דוגמאות ברשת. לכן במאמר הזה, לא נתמקד בביצועים של SQL המקומי. אך יהיו דוגמאות של איזה סוג של SQL הם יוצרים הפעלויות הJPA. בגלל שHibernate הוא היישום של JPA, מתברר שהגיוני להראות איך הAPI של JPA יכול לשנות מידע JSON במסד הנתונים של Postgres.

שינוי תכונות מושגים בעלי הערך בלי לשנות את כל הערך הJSON כולו (מסלול)

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

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

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

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

Posjsonhelper

היברנט מקבל תמיכה טובה יותר בשינויים בJSON בגרסה 7, כולל רוב הפונקציות והמפעילים המוצגים בזה המאמר. עדיין, אין תכניות להוסיף תמיכה כזו בגרסה 6. למרבה המזל, הפרוייקט Posjsonhelper מוסיף את התמיכה להיברנט בגרסה 6. כל הדוגמאות למטה תשתמשו בספריית Posjsonhelper.בחץ על קישור זה כדי למצוא איך לחבר ספרייה לפרוייקט הגיוני שלך. תהיה צריך גם לחבר FunctionContributor.

כל הדוגמאות משתמשות במחלקת יישות Java שמייצגת את טבלת ה-item, שההגדרה שלה ציינה לעיל:

Java

 

עטיפת פונקציית jsonb_set

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

לדוגמה, בקוד מטה מתווספת המאפיין "birthday" למאפיין הפנימי "child".

Java

 

קוד זה יגרום ליצירת משפט SQL כזה:

SQL

 

עטיפת אופרטור השרשור "||"

העטיפה עבור אופרטור השרשור (||) משרשרת שני ערכי JSONB לתוך ערך JSONB חדש.

על פי תיעוד Postgres, התנהגות האופרטור היא כדלקמן:

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

הנה דוגמה לאיך להשתמש בעטיפה זו בקוד שלך:

Java

 

קוד שממזג אובייקט JSON עם המאפיין child עם האובייקט JSON שנשמר כבר במסד הנתונים.

קוד זה יגרום ליצירת שאילתת SQL כזו:

SQL

 

מסירת השדה או אלמנט מרשימת המפתח בספר המובן הזה "#-"

ה Posjsonhelper מעורבת במעטף לפעולה המסירה (#-). היא מסירה את השדה או אלמנט מהרשימה בהתבסס על המספר בנתיב המצופה, בו האלמנטים בנתיב יכולים להיות מפתחות שדה או מספרים ברשימה. לדוגמה, הקוד הבא מסיר מהערך בעל השדה JSON המצופה על פי "child.pets"

Java

 

הSQL הווצר יהיה:

SQL

 

מסירת רבים מאלמנטים בנתיב מסויים

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

למטרה זו, ה Posjsonhelper יכולה לייצר פונקציה שחייבת להוספת לעסקה DDL ולהיבצע על הבסיס המידבורי שלך.

SQL

 

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

Java

 

פה הSQL שיוצר על ידי הקוד הקודם:

SQL

 

Hibernate6JsonUpdateStatementBuilder: איך לשלב מספרים של פעולות השינוי באותה הועדה העדכנית.

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

כדי להדגים זאת טוב יותר, תבחנו את הקוד SQL.

SQL

 

זה מנבע מכיוון שיש לנו ארבעה ביצועים של jsonb_set function ושתים על-פי הם פעולות delete. הפעולה הכי מעורבת delete היא פעולה של שינוי הJSON הראשונה מפני שהערך המקורי מעמד הJSON מועבר כפרמטר.

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

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

פה מדוגמה קטנה של קוד:

Java

 

ההצעה הSQL הזו שניתנה קודם לכך נוצרה על-ידי הקוד הזה.

כדי לדעת עוד על אופן פעולת הבונה, נא לבדוק את התיעוד.

מסקנה

בסיס הנתונים Postgres מציע מגוון רחב של אפשרויות בנוגע לפעולות שינוי נתונים בפורמט JSON. זה מביא אותנו לשקול את Postgres כבחירת פתרון טמון טובה. לכן, אם הפתרון שלנו אינו דורש ביצועי קריאה גבוהים יותר, שפרות טובה, או שיבוץ (אף על פי שכל הדברים הללו יכולים להישג עם בסיס הנתונים Postgres, במיוחד עם פתרונות המסופקים על ידי ספקי שירות ענן כמו AWS), האם שווה לשקול לאחסן את מסמכי ה-JSON שלך בבסיס הנתונים Postgres — לא לדבר על תמיכה בעסקאות עם בסיסי נתונים כמו Postgres.

Source:
https://dzone.com/articles/modify-json-data-in-postgres-and-hibernate