مكتبة PosjsonHelper هي مشروع مفتوح المصدر يضيف دعمًا للاستعلام عن Hibernate لوظائف PostgreSQL JSON. تحتوي المكتبة أيضًا على دعم لوظائف البحث عن نص PostgreSQL. لمعرفة المزيد حول كيفية استخدام مكونات البحث النصية ، تحقق من التعليمات لوحدة النص. المكتبة مكتوبة بلغة برمجة Java. يدعم المشروع لهذه اللحظة السبات مع الإصدار 5 و 6. الإصدار المطلوب من Java هو على الأقل الإصدار 8 لدعم Hibernate 5 والإصدار 11 لـ Hibernate 6.
المشروع متاح في مستودع مافن المركزي. يمكنك استخدامه فقط عن طريق إضافته كاعتماد في ملف واصف المشروع (pom.xml).
من أجل السبات 5:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate5</ artifactId >
< version >0.4.2</ version >
</ dependency >للسباحة 6:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate6</ artifactId >
< version >0.4.2</ version >
</ dependency >لا تملك مكتبة PosjsonHelper تبعية عابرة لمكتبة السبات. لذا يرجى مراعاة أن التبعية السباتية يجب أن تضاف بشكل منفصل في مشروعك كما هو موضح أدناه:
< dependency >
< groupId >org.hibernate</ groupId >
< artifactId >hibernate-core</ artifactId >
< version >????</ version >
</ dependency >يرجى التحقق من مصفوفة إصدار التوافق السطحي للتحقق من الإصدار الصحيح.
يتطلب التنفيذ الافتراضي لبعض الوظائف المتعلقة بعمليات JSON ORG.JSON: مكتبة JSON. ومع ذلك ، هناك طرق لتنفيذ واجهات محددة وقد لا تكون المكتبة ضرورية لإضافتها.
< dependency >
< groupId >org.json</ groupId >
< artifactId >json</ artifactId >
< version >20240303</ version >
</ dependency >إذا كان شخص ما يرغب في إنشاء المشروع محليًا من المصدر ، فيرجى الاطلاع على ملف المساهمة. للتحقق من كيفية إعداد المشروع محليًا.
مهم! هذا القسم صالح فقط لـ Hibernate 5. لتكون قادرًا على استخدام مكتبة PosjsonHelper في المشروع ، يجب تحديد لهجة السبات الصحيحة. تقوم المكتبة بتنفيذ عدد قليل من الأغلفة التي تمتد بالفعل لهجات السباتات ل postgresql:
يجب تعيين لهجة في ملف تكوين السبات على سبيل المثال:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< hibernate-configuration xmlns = " http://www.hibernate.org/xsd/orm/cfg " >
< session-factory >
< property name = " hibernate.dialect " >com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper</ property >
...أو على سبيل المثال في ملف خصائص تكوين Spring Framework:
...
spring.jpa.properties.hibernate.dialect =com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper
...في حالة وجود نوع بالفعل يمتد نوع لهجة السبات وهو مطلوب لمشروعك. يمكنك إضافة تعديل إلى النوع الخاص بك بحيث يستخدم مكون postgresqldialectenricher.
import com . github . starnowski . posjsonhelper . hibernate5 . PostgreSQLDialectEnricher ;
import org . hibernate . dialect . PostgreSQL95Dialect ;
public class PostgreSQLDialectWithDifferentSchema extends PostgreSQL95Dialect {
public PostgreSQLDialectWithDifferentSchema () {
PostgreSQLDialectEnricher enricher = new PostgreSQLDialectEnricher ();
enricher . enrich ( this );
}
}مهم! هذا القسم صالح فقط لـ Hibernate 6. لاستخدام مكتبة PosjsonHelper في المشروع الذي يستخدم Hibernate 6 ، يجب أن يكون هناك org.hibernate.boot.model.FunctionContributor. المكتبة لديها تنفيذ هذه الواجهة ، وهذا هو com.github.starnowski.posjsonhelper.hibernate6.posjsonhelperfunctionContributor.
لاستخدام هذا التنفيذ ، يجب إنشاء ملف باسم "org.hibernate.boot.model.functionContributor" ضمن "الموارد/meta-inf/services".
الحل البديل هو استخدام com.github.starnowski.posjsonhelper.hibernate6.sqmfunctionRegistryenricher مكون أثناء بدء التطبيق. كما في المثال أدناه مع استخدام إطار الربيع.
import com . github . starnowski . posjsonhelper . hibernate6 . SqmFunctionRegistryEnricher ;
import jakarta . persistence . EntityManager ;
import org . hibernate . query . sqm . NodeBuilder ;
import org . springframework . beans . factory . annotation . Autowired ;
import org . springframework . context . ApplicationListener ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . event . ContextRefreshedEvent ;
@ Configuration
public class FunctionDescriptorConfiguration implements
ApplicationListener < ContextRefreshedEvent > {
@ Autowired
private EntityManager entityManager ;
@ Override
public void onApplicationEvent ( ContextRefreshedEvent event ) {
NodeBuilder nodeBuilder = ( NodeBuilder ) entityManager . getCriteriaBuilder ();
SqmFunctionRegistryEnricher sqmFunctionRegistryEnricher = new SqmFunctionRegistryEnricher ();
sqmFunctionRegistryEnricher . enrich ( nodeBuilder . getQueryEngine (). getSqmFunctionRegistry ());
}
}لاستخدام مكتبة PosjsonHelper ، يجب إنشاء بعض وظائف SQL التي تنفذ مشغلي JSON. لا يمكن تنفيذ بعض مشغلي JSON بواسطة السبات لأنه يجب الهروب. بالنسبة للتكوين الافتراضي ، تتطلب المكتبة إنشاء الوظائف أدناه.
CREATE OR REPLACE FUNCTION jsonb_all_array_strings_exist (jsonb, text []) RETURNS boolean AS $$
SELECT $ 1 ?& $ 2 ;
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION jsonb_any_array_strings_exist (jsonb, text []) RETURNS boolean AS $$
SELECT $ 1 ?| $ 2 ;
$$ LANGUAGE SQL;يمكن تنفيذ عبارة DDL التي تم إنشاؤها أثناء اختبارات التكامل أو استخدامها بواسطة الأدوات التي تطبق التغييرات على قاعدة البيانات ، مثل Liquibase أو Flyway. مهم! إذا كان هناك شرط لاستخدام وظيفة مماثلة ولكن مع أسماء مختلفة ، فيجب تحديد ذلك في خصائص التطبيق. مطلوب لأن الأنواع تمتد نوع لهجة السبات ، المذكورة في ["كيفية إرفاق لهجة postgresql"] (#atach-atach-postgresql لهجة) قد لا يمكنه الوصول إلى سياق التطبيق (IOC). ومع ذلك ، في حالة وجود مثل هذه الخصائص بطريقة مختلفة ، فإن نوع postgresqldialectenricher لديه أيضًا طريقة لتمرير كائنات السياق (يرجى التحقق من السياق الأساسي وسياق السبات)
يحمل فئة السياق أسماء الوظائف التي تستخدمها المكتبة. تستخدم فئات اللهجة مكون corecontextpropertiessupplier الذي يولد كائن السياق على أساس خاصية النظام.
من الممكن أيضًا إضافة DDL برمجيًا باستخدام نوع DatabaseOperationExecutorfacade. فيما يلي مثال على كيفية تطبيق تغييرات DDL في التطبيق مع سياق Spring Framework.
import com . github . starnowski . posjsonhelper . core . Context ;
import com . github . starnowski . posjsonhelper . core . DatabaseOperationExecutorFacade ;
import com . github . starnowski . posjsonhelper . core . DatabaseOperationType ;
import org . springframework . beans . factory . annotation . Autowired ;
import org . springframework . context . ApplicationListener ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . event . ContextRefreshedEvent ;
import javax . sql . DataSource ;
@ Configuration
public class SQLFunctionsConfiguration implements
ApplicationListener < ContextRefreshedEvent > {
@ Autowired
private Context context ;
@ Autowired
private DataSource dataSource ;
@ Override
public void onApplicationEvent ( ContextRefreshedEvent contextRefreshedEvent ) {
DatabaseOperationExecutorFacade facade = new DatabaseOperationExecutorFacade ();
try {
facade . execute ( dataSource , context , DatabaseOperationType . LOG_ALL );
facade . execute ( dataSource , context , DatabaseOperationType . CREATE );
facade . execute ( dataSource , context , DatabaseOperationType . VALIDATE );
} catch ( Exception e ) {
throw new RuntimeException ( "Error during initialization of sql functions for jsonb type operations" , e );
}
}
}هناك بعض العمليات التي يمكن تنفيذها بواسطة كائن DatabaseOperationExecutorfacade
| اسم الخاصية | وصف |
|---|---|
| يخلق | يطبق تغييرات DDL على قاعدة البيانات |
| التحقق | يتحقق إذا تم تطبيق تغييرات DDL على قاعدة البيانات |
| يسقط | يسقط تغييرات DDL في قاعدة البيانات |
| log_all | يعرض البرامج النصية DDL لإنشاء العمليات والتحقق منها وإسقاطها |
للحصول على شرح أسهل ، لنفترض أن لدينا جدول قاعدة بيانات مع عمود واحد يخزن نوع JSONB.
create table item (
id int8 not null ,
jsonb_content jsonb,
primary key (id)
)لهذا الجدول ، يمكننا إدراج الصف مع أي JSON ، كما هو الحال في المثال أدناه:
INSERT INTO item (id, jsonb_content) VALUES ( 1 , ' {"top_element_with_set_of_values":["TAG1","TAG2","TAG11","TAG12","TAG21","TAG22"]} ' );
INSERT INTO item (id, jsonb_content) VALUES ( 2 , ' {"top_element_with_set_of_values":["TAG3"]} ' );
-- item without any properties, just an empty json
INSERT INTO item (id, jsonb_content) VALUES ( 6 , ' {} ' );
-- int values
INSERT INTO item (id, jsonb_content) VALUES ( 7 , ' {"integer_value": 132} ' );
-- double values
INSERT INTO item (id, jsonb_content) VALUES ( 10 , ' {"double_value": 353.01} ' );
INSERT INTO item (id, jsonb_content) VALUES ( 11 , ' {"double_value": -1137.98} ' );
-- enum values
INSERT INTO item (id, jsonb_content) VALUES ( 13 , ' {"enum_value": "SUPER"} ' );
-- string values
INSERT INTO item (id, jsonb_content) VALUES ( 18 , ' {"string_value": "the end of records"} ' );تستخدم معظم المكونات المسند كائن سياق السبات. يحمل في الغالب أسماء أسماء وظائف السبات المستخدمة في المشروع. تستخدم فئات اللهجة ونوع الوظائف في HibernateContextPropertiEssupplier المكون الذي يولد كائن HibernateContext استنادًا إلى خاصية النظام. إذا لم تكن هناك حاجة لتغيير أسماء وظائف HQL الافتراضية لمشغلي PSOJSONHELPER ، فسيتم استخدام HibernateContext حتى HibernateContex
HibernateContext hibernateContext = HibernateContext . builder (). build ();"jsonb_extract_path" هي وظيفة postgresql التي تُرجع قيمة JSONB التي تم الإشارة إليها بواسطة عناصر المسار التي تم تمريرها كـ "text []" (أي ما يعادل رقم> المشغل). إنه مفيد لأن الكثير من الوظائف تستخدم نوع "JSONB" للتنفيذ. يرجى التحقق من وثائق postgresql لمزيد من المعلومات. Hibernate 5 مثال : يوجد أدناه مثال على طريقة تُرجع قائمة العناصر التي تحتوي عليها خاصية محتوى JSON "TOP_ELEMENT_WITH_SET_OF_VALUES" على مجموعة دقيقة من القيم. مثال يستخدم jsonballarraysTringSexistpredicate.
@ Autowired
private HibernateContext hibernateContext ;
@ Autowired
private EntityManager entityManager ;
public List < Item > findAllByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}بالنسبة للطريقة أعلاه ، ستقوم Hibernate بتنفيذ استعلام HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_all_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1)) = TRUEسيكون SQL الأصليين أدناه:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_all_array_strings_exist(jsonb_extract_path( item0_ . jsonb_content ,?), array[?]) = trueلمزيد من التفاصيل ، يرجى التحقق من DAO المستخدمة في الاختبارات.
السبات 6 مثال :
يوجد أدناه نفس المثال أعلاه ولكن بالنسبة لـ Hibernate 6.
import org . hibernate . query . sqm . NodeBuilder ;
....
@ Autowired
private HibernateContext hibernateContext ;
@ Autowired
private EntityManager entityManager ;
public List < Item > findAllByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( NodeBuilder ) cb , new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}لمزيد من التفاصيل ، يرجى التحقق من DAO المستخدمة في الاختبارات.
"jsonb_extract_path_text" هي وظيفة postgresql التي تُرجع قيمة json كنص مشار إليه بواسطة عناصر المسار التي تم تمريرها على أنها "نص []" (يعادل المشغل #>>). يرجى التحقق من وثائق postgresql لمزيد من المعلومات. يوجد أدناه مثال على Hibernate 5 للطريقة التي تبحث عن عناصر تحتوي على قيم سلسلة محددة مطابقة للمشغل "مثل".
public List < Item > findAllByStringValueAndLikeOperator ( String expression ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( cb . like ( new JsonBExtractPathText (( CriteriaBuilderImpl ) cb , singletonList ( "string_value" ), root . get ( "jsonbContent" )), expression ));
return entityManager . createQuery ( query ). getResultList ();
}بالنسبة للطريقة أعلاه ، ستقوم Hibernate بتنفيذ استعلام HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_extract_path_text( generatedAlias0 . jsonbContent , :param0 ) like :param1سيكون SQL الأصليين أدناه:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_extract_path_text( item0_ . jsonb_content ,?) like ?لمزيد من التفاصيل والأمثلة مع المشغل في أو كيفية استخدام القيم الرقمية ، يرجى التحقق من DAO المستخدم في الاختبارات.
السبات 6 مثال :
يوجد أدناه نفس المثال أعلاه ولكن بالنسبة لـ Hibernate 6.
....
public List < Item > findAllByStringValueAndLikeOperator ( String expression ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( cb . like ( new JsonBExtractPathText ( root . get ( "jsonbContent" ), singletonList ( "string_value" ), ( NodeBuilder ) cb ), expression ));
return entityManager . createQuery ( query ). getResultList ();
}لمزيد من التفاصيل ، يرجى التحقق من DAO المستخدمة في الاختبارات.
يمثل نوع JSONBALLARRAYSTRINGSEXISTISTISTINGERICE أن يتحقق في ما إذا كانت صفائف السلسلة التي تم تمريرها موجودة في خاصية صفيف JSON. تم تقديم المثال الأول لهذا المستعار في قسم "jsonbextractpath - jsonb_extract_path". تفترض هذه المتنبئات أن وظيفة SQL ذات الاسم الافتراضي JSONB_ALL_ARRAY_STRINGS_EXIST ، المذكورة في القسم "تطبيق تغييرات DDL" موجودة. المثال أدناه مع تركيبة مع المشغل لا يعرض عناصر لا تحتوي على جميع السلاسل التي تم تفتيشها. مثال صالح لـ Hibernate 5 فقط!
public List < Item > findAllThatDoNotMatchByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
Predicate notAllMatchingTags = cb . not ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
Predicate withoutSetOfValuesProperty = cb . isNull ( new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )));
query . where ( cb . or ( withoutSetOfValuesProperty , notAllMatchingTags ));
return entityManager . createQuery ( query ). getResultList ();
}بالنسبة للطريقة أعلاه ، ستقوم Hibernate بتنفيذ استعلام HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
(
jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) is null
)
or (
jsonb_all_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param1 ) , json_function_json_array(:param2, :param3)) = FALSE
)سيكون SQL الأصليين أدناه:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_extract_path( item0_ . jsonb_content ,?) is null
or jsonb_all_array_strings_exist(jsonb_extract_path( item0_ . jsonb_content ,?), array[?,?]) = falseالسبات 6 مثال :
يوجد أدناه نفس المثال أعلاه ولكن بالنسبة لـ Hibernate 6.
public List < Item > findAllThatDoNotMatchByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
Predicate notAllMatchingTags = cb . not ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( NodeBuilder ) cb , new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )), tags . toArray ( new String [ 0 ])));
Predicate withoutSetOfValuesProperty = cb . isNull ( new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )));
query . where ( cb . or ( withoutSetOfValuesProperty , notAllMatchingTags ));
return entityManager . createQuery ( query ). getResultList ();
}لمزيد من التفاصيل ، يرجى التحقق من DAO المستخدمة في الاختبارات.
يمثل نوع JsonbanyarrayStringSexiStisterCate مسندًا يتحقق مما إذا كانت صفائف السلسلة التي تم تمريرها موجودة في خاصية Array JSON. تفترض هذه المتنبئين أن وظيفة SQL ذات الاسم الافتراضي JSONB_ANY_ARRAY_STRINGS_EXIST ، المذكورة في القسم "تطبيق تغييرات DDL" موجودة. يوجد أدناه مثال على الطريقة التي تبحث عن جميع العناصر التي تحتوي على المصفوفة التي تحتوي على مجموعة واحدة على الأقل تم تمريرها من المصفوفة التي تم تمريرها كوسيطة طريقة. مثال صالح لـ Hibernate 5 فقط!
public List < Item > findAllByAnyMatchingTags ( HashSet < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAnyArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}بالنسبة للطريقة أعلاه ، ستقوم Hibernate بتنفيذ استعلام HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_any_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1, :param2)) = TRUEسيكون SQL الأصليين أدناه:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_any_array_strings_exist(jsonb_extract_path( item0_ . jsonb_content ,?), array[?,?]) = trueالسبات 6 مثال :
يوجد أدناه نفس المثال أعلاه ولكن بالنسبة لـ Hibernate 6.
public List < Item > findAllByAnyMatchingTags ( HashSet < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAnyArrayStringsExistPredicate ( hibernateContext , ( NodeBuilder ) cb , new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}لمزيد من التفاصيل والأمثلة مع المشغل في أو كيفية استخدام القيم الرقمية ، يرجى التحقق من DAO المستخدم في الاختبارات.
يمكن أيضًا استخدام المكتبة لعمليات تعديل JSON. بشكل افتراضي ، في Hibernate ، يمكننا دائمًا تحديث عمود بمحتوى JSON عن طريق تعيين قيمته بالكامل. تتيح لك مكتبة PosjsonHelper أيضًا تعديل محتوى JSON عن طريق إعداد أو استبدال أو إزالة خصائص JSON الفردية دون استبدال محتوىها الكامل. تحتوي المكتبة على العديد من وظائف JSON والمشغلين التي تسمح لهذا النوع من التشغيل.
غلاف لوظيفة JSONB_SET. تقوم الوظيفة بتعيين أو تحل محل قيمة خاصية JSON بناءً على مسار JSON. تحقق من المثال التالي عن كيفية استخدامه مع مكون المعايير:
// GIVEN
Long itemId = 19L ;
String property = "birthday" ;
String value = "1970-01-01" ;
String expectedJson = "{ " child " : { " pets " : [ " dog " ], " birthday " : " 1970-01-01 " }}" ;
// when
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , new JsonbSetFunction (( NodeBuilder ) entityManager . getCriteriaBuilder (), root . get ( "jsonbContent" ), new JsonTextArrayBuilder (). append ( "child" ). append ( property ). build (). toString (), JSONObject . quote ( value ), hibernateContext ));
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), itemId ));
// Execute the update
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// then
Item item = tested . findById ( itemId );
assertThat (( String ) JsonPath . read ( item . getJsonbContent (), "$.child." + property )). isEqualTo ( value );
JSONObject jsonObject = new JSONObject ( expectedJson );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( jsonObject . toString ());هذا من شأنه أن يولد عبارة تحديث SQL التالية:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], ?::jsonb)
where
id = ?
Hibernate:
select
i1_0 . id ,
i1_0 . jsonb_content
from
item i1_0
where
i1_0 . id = ?يمكن أيضًا استخدام الوظيفة في عبارات HQL ، كما في المثال التالي:
@ Transactional
public void updateJsonBySettingPropertyForItemByHQL ( Long itemId , String property , String value ) {
// Execute the update
String hqlUpdate = "UPDATE Item SET jsonbContent = jsonb_set(jsonbContent, %s(:path, 'text[]'), %s(:json, 'jsonb' ) ) WHERE id = :id" . formatted ( hibernateContext . getCastFunctionOperator (), hibernateContext . getCastFunctionOperator ());
int updatedEntities = entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , itemId )
. setParameter ( "path" , new JsonTextArrayBuilder (). append ( "child" ). append ( property ). build (). toString ())
. setParameter ( "json" , JSONObject . quote ( value ))
. executeUpdate ();
}غلاف لمشغل التسلسل. Wrapper Concatenate اثنين من قيمتين JSONB في قيمة JSONB جديدة. تحقق من المثال التالي عن كيفية استخدامه مع مكون المعايير:
// GIVEN
Long itemId = 19l ;
String property = "birthday" ;
String value = "1970-01-01" ;
// WHEN
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
JSONObject jsonObject = new JSONObject ();
jsonObject . put ( "child" , new JSONObject ());
jsonObject . getJSONObject ( "child" ). put ( property , value );
criteriaUpdate . set ( "jsonbContent" , new ConcatenateJsonbOperator (( NodeBuilder ) entityManager . getCriteriaBuilder (), root . get ( "jsonbContent" ), jsonObject . toString (), hibernateContext ));
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), itemId ));
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
Item item = tested . findById ( itemId );
assertThat (( String ) JsonPath . read ( item . getJsonbContent (), "$.child." + property )). isEqualTo ( value );
JSONObject expectedJsonObject = new JSONObject (). put ( property , value );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$.child" ));
assertThat ( document . jsonString ()). isEqualTo ( expectedJsonObject . toString ());هذا من شأنه أن يولد عبارة تحديث SQL التالية:
update
item
set
jsonb_content = jsonb_content || ?::jsonb
where
id = ?
Hibernate:
select
i1_0 . id ,
i1_0 . jsonb_content
from
item i1_0
where
i1_0 . id = ?يمكن أيضًا استخدام الوظيفة في عبارات HQL ، كما في المثال التالي:
@ Transactional
public void updateJsonPropertyForItemByHQL ( Long itemId , String property , String value ) throws JSONException {
JSONObject jsonObject = new JSONObject ();
jsonObject . put ( "child" , new JSONObject ());
jsonObject . getJSONObject ( "child" ). put ( property , value );
String hqlUpdate = "UPDATE Item SET jsonbContent = %s(jsonbContent, %s(:json, 'jsonb' ) ) WHERE id = :id" . formatted ( hibernateContext . getConcatenateJsonbOperator (), hibernateContext . getCastFunctionOperator ());
int updatedEntities = entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , itemId )
. setParameter ( "json" , jsonObject . toString ())
. executeUpdate ();
}Wrapper for Deletes Operator '#-'. يحذف الغلاف الحقل أو عنصر الصفيف بناءً على الفهرس في المسار المحدد ، حيث يمكن أن تكون عناصر المسار إما مفاتيح حقل أو فهارس الصفيف. تحقق من المثال التالي عن كيفية استخدامه مع مكون المعايير:
// GIVEN
Item item = tested . findById ( 19L );
JSONObject jsonObject = new JSONObject ( "{ " child " : { " pets " : [ " dog " ]}}" );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( jsonObject . toString ());
// WHEN
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , new DeleteJsonbBySpecifiedPathOperator (( NodeBuilder ) entityManager . getCriteriaBuilder (), root . get ( "jsonbContent" ), new JsonTextArrayBuilder (). append ( "child" ). append ( "pets" ). build (). toString (), hibernateContext ));
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 19L ));
// Execute the update
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
jsonObject = new JSONObject ( "{ " child " : {}}" );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( jsonObject . toString ());هذا من شأنه أن يولد عبارة تحديث SQL التالية:
update
item
set
jsonb_content = (jsonb_content # - ?::text[])
where
id = ?يمكن أيضًا استخدام الوظيفة في عبارات HQL ، كما في المثال التالي:
@ Transactional
public void updateJsonByDeletingSpecificPropertyForItemByHql ( Long itemId , String property ) {
// Execute the update
String hqlUpdate = "UPDATE Item SET jsonbContent = %s(jsonbContent, %s(:path, 'text[]') ) WHERE id = :id" . formatted ( hibernateContext . getDeleteJsonBySpecificPathOperator (), hibernateContext . getCastFunctionOperator ());
int updatedEntities = entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , itemId )
. setParameter ( "path" , new JsonTextArrayBuilder (). append ( "child" ). append ( property ). build (). toString ())
. executeUpdate ();
}نوع removeJsonValuesFromJsonArrayFunction هو مشغل السبات الذي يستدعي وظيفة SQL التي تم إنشاؤها بواسطة مكتبة PosjsonHelper. بشكل افتراضي ، تبدو الوظيفة التي تم إنشاؤها مثل المثال أدناه:
CREATE OR REPLACE FUNCTION {{schema}}.remove_values_from_json_array(input_json jsonb, values_to_remove jsonb) RETURNS jsonb AS $$
DECLARE
result jsonb;
BEGIN
IF jsonb_typeof(values_to_remove) <> ' array ' THEN
RAISE EXCEPTION ' values_to_remove must be a JSON array ' ;
END IF;
result : = (
SELECT jsonb_agg(element)
FROM jsonb_array_elements(input_json) AS element
WHERE NOT (element IN ( SELECT jsonb_array_elements(values_to_remove)))
);
RETURN COALESCE(result, ' [] ' ::jsonb);
END;
$$ LANGUAGE plpgsql;الوظيفة لها معلمتين إدخالان. الأول هو صفيف JSON ، وهو صفيف أساسي للنتيجة التي ستعودها الوظيفة. المعلمة الثانية هي أيضًا مجموعة JSON التي تمثل عنصرًا يجب إزالته من صفيف النتيجة. فيما يلي مثال رمز على كيفية استخدام هذه الوظيفة مع مشغل آخر لتحديث أعمدة JSON باستخدام عبارة تحديث SQL.
// GIVEN
Item item = tested . findById ( 24L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " mask " , " fins " , " compass " ]}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
NodeBuilder nodeBuilder = ( NodeBuilder ) entityManager . getCriteriaBuilder ();
JSONArray toRemoveJSONArray = new JSONArray ( Arrays . asList ( "mask" , "compass" ));
RemoveJsonValuesFromJsonArrayFunction deleteOperator = new RemoveJsonValuesFromJsonArrayFunction ( nodeBuilder , new JsonBExtractPath ( root . get ( "jsonbContent" ), nodeBuilder , Arrays . asList ( "inventory" )), toRemoveJSONArray . toString (), hibernateContext );
JsonbSetFunction jsonbSetFunction = new JsonbSetFunction ( nodeBuilder , ( SqmTypedNode ) root . get ( "jsonbContent" ), new JsonTextArrayBuilder (). append ( "inventory" ). build (). toString (), deleteOperator , hibernateContext );
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , jsonbSetFunction );
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 24L ));
// WHEN
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " fins " ]}" );المثال نفسه ولكن مع مثال استعلام HQL:
// GIVEN
Item item = tested . findById ( 24L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " mask " , " fins " , " compass " ]}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
JSONArray toRemoveJSONArray = new JSONArray ( Arrays . asList ( "mask" , "compass" ));
String hqlUpdate = "UPDATE Item SET jsonbContent = %s(jsonbContent, %s(:path, 'text[]'), %s(jsonb_extract_path( jsonbContent , 'inventory' ), %s(:to_remove, 'jsonb')) ) WHERE id = :id" . formatted ( JSONB_SET_FUNCTION_NAME , hibernateContext . getCastFunctionOperator (), hibernateContext . getRemoveJsonValuesFromJsonArrayFunction (), hibernateContext . getCastFunctionOperator ());
// WHEN
entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , 24L )
. setParameter ( "path" , new JsonTextArrayBuilder (). append ( "inventory" ). build (). toString ())
. setParameter ( "to_remove" , toRemoveJSONArray . toString ())
. executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " fins " ]}" );هذان المثالان سيولدان أدناه بيان SQL:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], remove_values_from_json_array(jsonb_extract_path(jsonb_content, ?), ?::jsonb))
where
id = ?يمكن أن يكون استخدام وظيفة JSONB_SET واحدة لتعيين خاصية واحدة لـ JSON مع عبارة تحديث واحدة مفيدة ، ومع ذلك ، قد يكون من المفيد أن تكون قادرًا على تعيين خصائص متعددة على مستويات مختلفة من شجرة JSON مع عبارة تحديث واحدة.
خشية التحقق أدناه مثال الرمز:
// GIVEN
Item item = tested . findById ( 23L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " dog " ]}, " inventory " :[ " mask " , " fins " ], " nicknames " :{ " school " : " bambo " , " childhood " : " bob " }}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
Hibernate6JsonUpdateStatementBuilder hibernate6JsonUpdateStatementBuilder = new Hibernate6JsonUpdateStatementBuilder ( root . get ( "jsonbContent" ), ( NodeBuilder ) entityManager . getCriteriaBuilder (), hibernateContext );
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "child" ). append ( "birthday" ). build (), quote ( "2021-11-23" ));
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "child" ). append ( "pets" ). build (), "[ " cat " ]" );
hibernate6JsonUpdateStatementBuilder . appendDeleteBySpecificPath ( new JsonTextArrayBuilder (). append ( "inventory" ). append ( "0" ). build ());
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "parents" ). append ( 0 ). build (), "{ " type " : " mom " , " name " : " simone " }" );
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "parents" ). build (), "[]" );
hibernate6JsonUpdateStatementBuilder . appendDeleteBySpecificPath ( new JsonTextArrayBuilder (). append ( "nicknames" ). append ( "childhood" ). build ());
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , hibernate6JsonUpdateStatementBuilder . build ());
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 23L ));
// WHEN
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " cat " ], " birthday " : " 2021-11-23 " }, " parents " :[{ " name " : " simone " , " type " : " mom " }], " inventory " :[ " fins " ], " nicknames " :{ " school " : " bambo " }}" );في الكود أعلاه ، نريد تعيين ثلاث خصائص JSON "Child.birthday" و "child.pets" و "Parents" وحذف اثنين آخرين ، "المخزون .0" و "الأسماء. خاصية "الوالدين" هي ملكية جديدة يفترض أنها صفيف. على الرغم من أن إعداد خاصية صفيف جديدة مع بعض القيم يمكن القيام بها مع تشغيل واحد ، ولكن لغرض العرض التوضيحي ، فإننا نستخدم عمليتين. واحد هو وضع خاصية جديدة تسمى "أولياء الأمور" مع صفيف JSON الفارغ كقيمة. وعملية أخرى تُحدد عنصر صفيف في فهرس محدد. إذا لم يكن هناك عقار أعلى ، فيجب إنشاءه قبل الممتلكات الداخلية. لحسن الحظ ، فإن المثيل الافتراضي لنوع Hibernate6JsonupDateStateMentBuilder يحتوي على مكونات مناسبة للفرز والتصفية لمساعدتك في تعيين ترتيب العمليات الصحيح. لذلك لا يهم ما إذا كنا نضيف عملية العناصر الإضافية قبل أو بعد إضافة عملية إنشاء المباراة. افتراضيًا ، ستتم إضافة العمليات التي حذف المحتوى قبل تلك التي تضيف أو استبدال المحتوى. بالطبع ، من الممكن تعطيل هذا السلوك عن طريق تعيين هذه المكونات على Null. لمزيد من التفاصيل ، يرجى التحقق من Javadoc لنوع Hibernate6JsonupDateStatementBuilder.
يولد هذا الرمز أدناه عبارة SQL:
update
item
set
jsonb_content =
jsonb_set(
jsonb_set(
jsonb_set(
jsonb_set(
(
(jsonb_content # - ?::text[]) -- the most nested #- operator
# - ?::text[])
, ?:: text [], ?::jsonb) -- the most nested jsonb_set operation
, ?:: text [], ?::jsonb)
, ?:: text [], ?::jsonb)
, ?:: text [], ?::jsonb)
where
id = ?إن تنفيذ وظيفة JSONB_SET الأكثر داخليًا لهذا البيان المعد هو تعيين صفيف فارغ لخاصية "الوالدين".
يحتوي المنشئ على طرق لتحديد القيم:
إزالة الخصائص:
appendDeleteBySpecificPath (Jsontextarray jsontextarray)
إضافة عناصر صفيف
إزالة عناصر الصفيف
تتطلب بعض الطرق المتعلقة بالتعديل على صفيف JSON افتراضيًا مكتبة org.json.json (تحقق من التبعيات الاختيارية). ومع ذلك ، من الممكن تمرير التنفيذ المخصص للواجهة التي تقوم بتخطيط كائن مجموعة إلى قيمة صفيف JSON مع "withCollectionToJsonArrayStringMapper (com.github.starnowski.posjsonhelper.hibernate6.hibernate6jsonupdatestateMentBuilder.collectiontojsonarrayStringMper)
نوع hibernate6jsonupdateStateMentBuilder عام. النوع العام الثاني هو قيمة مخصصة يمكن إضافتها إلى سياق Hibernate6JsonupDateStatementBuilder. فيما يلي مثال رمز يمثل نوعه عمليات الصفيف (العناصر التي يجب إضافتها وإزالتها من صفيف).
نوع القيمة المخصصة:
private static class JsonArrayOperations {
private final List < String > toDelete ;
private final List < String > toAdd ;
public JsonArrayOperations ( List < String > toDelete , List < String > toAdd ) {
this . toDelete = toDelete ;
this . toAdd = toAdd ;
}
public List < String > getToDelete () {
return toDelete ;
}
public List < String > getToAdd () {
return toAdd ;
}
}مثال الاستخدام:
// GIVEN
Item item = tested . findById ( 24L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " mask " , " fins " , " compass " ]}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
Hibernate6JsonUpdateStatementBuilder < Object , JsonArrayOperations > hibernate6JsonUpdateStatementBuilder = new Hibernate6JsonUpdateStatementBuilder ( root . get ( "jsonbContent" ), ( NodeBuilder ) entityManager . getCriteriaBuilder (), hibernateContext );
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "child" ). append ( "pets" ). build (), null , new JsonArrayOperations ( Arrays . asList ( "crab" , "ant" ), Arrays . asList ( "lion" , "dolphin" )));
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "name" ). build (), JSONObject . quote ( "Simon" ));
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "inventory" ). build (), null , new JsonArrayOperations ( Arrays . asList ( "compass" , "mask" ), Arrays . asList ( "knife" )));
hibernate6JsonUpdateStatementBuilder . withJsonbSetFunctionFactory ( new Hibernate6JsonUpdateStatementBuilder . DefaultJsonbSetFunctionFactory < Object , JsonArrayOperations >() {
public JsonbSetFunction build ( NodeBuilder nodeBuilder , Path < Object > rootPath , JsonUpdateStatementConfiguration . JsonUpdateStatementOperation < JsonArrayOperations > operation , HibernateContext hibernateContext ) {
if ( operation . getCustomValue () != null ) {
JSONArray toAddJSONArray = new JSONArray ( operation . getCustomValue (). getToAdd ());
ConcatenateJsonbOperator concatenateOperator = new ConcatenateJsonbOperator ( nodeBuilder , new JsonBExtractPath ( rootPath , nodeBuilder , operation . getJsonTextArray (). getPath (). stream (). map ( ob -> ob . toString ()). collect ( Collectors . toList ())), toAddJSONArray . toString (), hibernateContext );
JSONArray toRemoveJSONArray = new JSONArray ( operation . getCustomValue (). getToDelete ());
RemoveJsonValuesFromJsonArrayFunction deleteOperator = new RemoveJsonValuesFromJsonArrayFunction ( nodeBuilder , concatenateOperator , toRemoveJSONArray . toString (), hibernateContext );
return new JsonbSetFunction ( nodeBuilder , ( SqmTypedNode ) rootPath , operation . getJsonTextArray (). toString (), deleteOperator , hibernateContext );
} else {
return super . build ( nodeBuilder , rootPath , operation , hibernateContext );
}
}
@ Override
public JsonbSetFunction build ( NodeBuilder nodeBuilder , SqmTypedNode sqmTypedNode , JsonUpdateStatementConfiguration . JsonUpdateStatementOperation < JsonArrayOperations > operation , HibernateContext hibernateContext ) {
if ( operation . getCustomValue () != null ) {
JSONArray toAddJSONArray = new JSONArray ( operation . getCustomValue (). getToAdd ());
ConcatenateJsonbOperator concatenateOperator = new ConcatenateJsonbOperator ( nodeBuilder , new JsonBExtractPath ( root . get ( "jsonbContent" ), nodeBuilder , operation . getJsonTextArray (). getPath (). stream (). map ( ob -> ob . toString ()). collect ( Collectors . toList ())), toAddJSONArray . toString (), hibernateContext );
JSONArray toRemoveJSONArray = new JSONArray ( operation . getCustomValue (). getToDelete ());
RemoveJsonValuesFromJsonArrayFunction deleteOperator = new RemoveJsonValuesFromJsonArrayFunction ( nodeBuilder , concatenateOperator , toRemoveJSONArray . toString (), hibernateContext );
return new JsonbSetFunction ( nodeBuilder , sqmTypedNode , operation . getJsonTextArray (). toString (), deleteOperator , hibernateContext );
} else {
return super . build ( nodeBuilder , sqmTypedNode , operation , hibernateContext );
}
}
});
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , hibernate6JsonUpdateStatementBuilder . build ());
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 24L ));
// WHEN
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " name " : " Simon " , " child " :{ " pets " :[ " chameleon " , " lion " , " dolphin " ]}, " inventory " :[ " fins " , " knife " ]}" );| اسم الخاصية | وصف |
|---|---|
| com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist | اسم وظيفة SQL التي تتحقق مما إذا كانت جميع العناصر التي مرت كنص [] موجودة في خاصية صفيف JSON. بشكل افتراضي ، الاسم هو JSONB_ALL_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist | اسم وظيفة SQL التي تتحقق إذا كانت أي عناصر تم تمريرها كنص [] موجودة في خاصية صفيف JSON. بشكل افتراضي ، الاسم هو JSONB_ANY_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.functions.remove_values_from_json_array | اسم وظيفة SQL التي تُرجع مجموعة JSONB عن طريق حذف العناصر من صفيف JSONB تم تمريرها كمدخل للوظيفة. بشكل افتراضي ، الاسم هو remove_values_from_json_array |
| com.github.starnowski.posjsonhelper.core.schema | اسم مخطط قاعدة البيانات حيث يجب إنشاء وظائف SQL |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_all_array_strings_exist | اسم وظيفة HQL التي تستدعي وظيفة SQL المحددة بواسطة com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist الخاصية. بشكل افتراضي ، الاسم هو JSONB_ALL_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_any_array_strings_exist | اسم وظيفة HQL التي تستدعي وظيفة SQL المحددة بواسطة com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist الخاصية. بشكل افتراضي ، الاسم هو JSONB_ANY_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.json_function_json_array | اسم وظيفة HQL التي تلتف مشغل الصفيف في postgresql. بشكل افتراضي ، الاسم هو JSON_FUNCTION_JSON_ARRAY |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.remove_values_from_json_array | اسم وظيفة HQL التي تلتف الوظيفة التي تُرجع مجموعة JSONB عن طريق حذف العناصر من صفيف JSONB تم تمريرها كمدخل للوظيفة. بشكل افتراضي ، الاسم هو remove_values_from_json_array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.sqldefinitionContextFactory.types | خاصية النظام التي تخزن قائمة com.github.starnowski.posjsonhelper.core.sql.isqldefinitioncontextfactory أنواع يجب تحميلها. بدلاً من أنواع التحميل التي يمكن العثور عليها على classpath للحزمة "com.github.starnowski.posjsonhelper". يتم فصل الأنواع في القائمة بواسطة حرف فاصلة ".". |
| com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.types | (تستخدم فقط في heibernate 6) خاصية النظام التي تخزن قائمة com.github.starnowski.posjsonhelper.hibernate6.descriptor.functionDescriptorRegisterFactoriEssupplier التي ينبغي تحميلها. بدلاً من أنواع التحميل التي يمكن العثور عليها على classpath للحزمة "com.github.starnowski.posjsonhelper". يتم فصل الأنواع في القائمة بواسطة حرف فاصلة ".". |
| com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.types.excluded | (يستخدم فقط في Hibernate 6) خاصية النظام التي تخزن قائمة com.github.starnowski.posjsonhelper.hibernate6.descriptor.functionDescriptorregisterFactoriEssupplier التي ينبغي استبعادها من التحميل. إذا كان "com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.types" تم تحديد خاصية "com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.Excluded". يتم فصل الأنواع في القائمة بواسطة حرف فاصلة ".". |
مصفوفة التوافق مع السبات 6.
| posjsonhelper | السبات 6 |
|---|---|
| 0.3.0 | 6.4.0.final |
| 0.2.0 - 0.2.1 | 6.1.5.final |
مشكلة مع حزمة السبات أو الإصدار أو الفئات وما إلى ذلك.
إذا كنت تواجه مشكلة تتعلق بتعريف الطريقة المفقودة أو الكتابة على سبيل المثال:
java.lang.NoSuchMethodError: 'org.hibernate.query.criteria.JpaExpression
ثم أولاً ، يرجى التحقق مما إذا كان مشروعك يحتوي على مكتبة نواة السبات على ClassPath. يعتبر Hibernate-Core التبعية الاختيارية لهذا المشروع وعليك التأكد من إضافته في مشروعك. يرجى التحقق من العدد المماثل 145. إذا كنت سباتيك على classpath وما زالت المشكلة موجودة ، فيرجى الإبلاغ عن المشكلة.