POSJSONHELPER Library adalah proyek open-source yang menambah dukungan kueri hibernate untuk fungsi PostgreSQL JSON. Perpustakaan juga memiliki dukungan untuk fungsi pencarian teks PostgreSQL. Untuk mengetahui lebih lanjut tentang cara menggunakan komponen pencarian teks, periksa instruksi untuk modul teks. Perpustakaan ditulis dalam bahasa pemrograman Java. Proyek untuk momen ini mendukung Hibernate dengan versi 5 dan 6. Versi Java yang diperlukan setidaknya versi 8 untuk dukungan Hibernate 5 dan versi 11 untuk Hibernate 6.
Proyek ini tersedia di repositori Central Maven. Anda dapat menggunakannya hanya dengan menambahkannya sebagai ketergantungan dalam file deskriptor proyek (pom.xml).
Untuk Hibernate 5:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate5</ artifactId >
< version >0.4.2</ version >
</ dependency >Untuk Hibernate 6:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate6</ artifactId >
< version >0.4.2</ version >
</ dependency >Perpustakaan Posjsonhelper tidak memiliki ketergantungan sementara ke perpustakaan hibernasi. Jadi harap diingat bahwa ketergantungan hibernasi harus ditambahkan secara terpisah dalam proyek Anda seperti di bawah ini:
< dependency >
< groupId >org.hibernate</ groupId >
< artifactId >hibernate-core</ artifactId >
< version >????</ version >
</ dependency >Silakan periksa matriks versi kompatibilitas hibernate untuk memeriksa versi yang benar.
Implementasi default untuk beberapa fungsi yang terkait dengan operasi JSON memerlukan org.json: Perpustakaan JSON. Namun, ada cara untuk mengimplementasikan antarmuka tertentu dan di bawah pustaka mungkin tidak perlu ditambahkan.
< dependency >
< groupId >org.json</ groupId >
< artifactId >json</ artifactId >
< version >20240303</ version >
</ dependency >Jika seseorang ingin membangun proyek secara lokal dari sumber, silakan lihat file Contributing.md untuk memeriksa cara mengatur proyek secara lokal.
Penting! Bagian ini hanya berlaku untuk Hibernate 5. Untuk dapat menggunakan PERPUSTAKAAN POSJSONHELPER dalam proyek ini harus ditentukan dialek Hibernate yang benar. Perpustakaan mengimplementasikan beberapa pembungkus yang meluas sudah ada dialek hibernate untuk postgresql:
Dialek harus diatur dalam file konfigurasi hibernate misalnya:
<? 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 >
...atau misalnya dalam file Properti Konfigurasi Kerangka Kerja Spring:
...
spring.jpa.properties.hibernate.dialect =com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper
...Jika Anda sudah memiliki jenis yang memperluas jenis dialek hibernasi dan diperlukan untuk proyek Anda. Anda menambahkan penyesuaian pada tipe Anda sehingga akan menggunakan komponen postgresqldialectenecher.
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 );
}
}Penting! Bagian ini hanya berlaku untuk Hibernate 6. untuk menggunakan PERPUSTAKAAN POSJSONHELPER dalam proyek yang menggunakan Hibernate 6, harus ada org.hibernate.boot.model.functionContributor Implementasi yang ditentukan. Perpustakaan memiliki implementasi antarmuka ini, yaitu com.github.starnowski.posjsonhelper.hibernate6.posjsonhelperfunctionContributor.
Untuk menggunakan implementasi ini diperlukan untuk membuat file dengan nama "org.hibernate.boot.model.functionContributor" di bawah "sumber daya/meta-inf/services" direktori.
Solusi alternatifnya adalah menggunakan com.github.starnowski.posjsonhelper.hibernate6.sqmfunctionRegistryEndereChere komponen selama start-up aplikasi. Seperti pada contoh di bawah ini dengan penggunaan kerangka kerja musim semi.
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 ());
}
}Untuk menggunakan pustaka PosjsonHelper, diperlukan untuk membuat beberapa fungsi SQL yang mengeksekusi operator JSON. Beberapa operator JSON tidak dapat dieksekusi oleh Hibernate karena mereka harus dilarikan. Untuk konfigurasi default, pustaka membutuhkan fungsi di bawah ini untuk dibuat.
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;Pernyataan DDL yang dihasilkan dapat dieksekusi selama tes integrasi atau digunakan oleh alat yang menerapkan perubahan pada database, seperti Liquibase atau Flyway. Penting! Jika akan ada persyaratan untuk menggunakan fungsi yang sama tetapi dengan nama yang berbeda maka ini harus ditentukan dalam properti aplikasi. Diperlukan karena tipe memperluas tipe dialek hibernasi, yang disebutkan dalam bagian ["cara melampirkan dialek PostgreSQL"] (#cara-cara-memasang-postgresql dialek) mungkin tidak memiliki akses ke konteks aplikasi (IOC). Namun, jika properti tersebut harus diteruskan dengan cara yang berbeda maka tipe PostgreSQLialectenrim
Kelas konteks memiliki nama fungsi yang digunakan oleh perpustakaan. Kelas dialek menggunakan komponen CoreContextProperterSupplier yang menghasilkan objek konteks berdasarkan properti sistem.
Hal ini juga dapat menambahkan DDL secara terprogram dengan menggunakan tipe DatabaseOperationExecutorFacade. Di bawah ini ada contoh tentang cara menerapkan perubahan DDL dalam aplikasi dengan konteks 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 );
}
}
}Ada beberapa operasi yang dapat dijalankan oleh Objek DatabaseOperationExecutorFacade
| Nama Properti | Keterangan |
|---|---|
| MEMBUAT | Menerapkan perubahan DDL ke database |
| MENGESAHKAN | Memvalidasi jika perubahan DDL diterapkan pada database |
| MENJATUHKAN | Menjatuhkan perubahan DDL dalam database |
| Log_all | Menampilkan skrip DDL untuk membuat, memvalidasi, dan lepas operasi |
Untuk penjelasan yang lebih mudah, mari kita asumsikan bahwa kami memiliki tabel basis data dengan satu kolom yang menyimpan tipe JSONB.
create table item (
id int8 not null ,
jsonb_content jsonb,
primary key (id)
)Untuk tabel ini, kami dapat memasukkan baris dengan JSON, seperti pada contoh di bawah ini:
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"} ' );Sebagian besar komponen predikat menggunakan objek konteks hibernate. Ini sebagian besar memegang nama nama fungsi hibernat yang digunakan dalam proyek. Kelas dialek dan tipe FunctionContributor Gunakan komponen HibernateContextPropertiessupplier yang menghasilkan objek HibernateContext berdasarkan properti sistem. Jika tidak perlu mengubah nama fungsi HQL default untuk operator psoJsonHelper maka bahkan menggunakan hibernatecontext yang dibuat oleh komponen pembangun seperti di bawah ini:
HibernateContext hibernateContext = HibernateContext . builder (). build ();"JSONB_EXTRACT_PATH" adalah fungsi PostgreSQL yang mengembalikan nilai JSONB yang ditunjukkan oleh elemen jalur yang dilewati sebagai "teks []" (setara dengan operator #>). Ini berguna karena banyak fungsi menggunakan jenis "JSONB" untuk eksekusi. Silakan periksa dokumentasi PostgreSQL untuk informasi lebih lanjut. Hibernate 5 Contoh : Di bawah ini ada contoh metode yang mengembalikan daftar objek item yang properti konten JSON "Top_element_with_set_of_values" berisi serangkaian nilai yang tepat. Contohnya menggunakan 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 ();
}Untuk metode di atas, Hibernate akan menjalankan kueri HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_all_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1)) = TRUESQL asli akan memiliki bentuk di bawah ini:
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[?]) = trueUntuk detail lebih lanjut silakan periksa DAO yang digunakan dalam tes.
Hibernate 6 Contoh :
Di bawah ada contoh yang sama seperti di atas tetapi untuk 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 ();
}Untuk detail lebih lanjut silakan periksa DAO yang digunakan dalam tes.
"Jsonb_extract_path_text" adalah fungsi postgresql yang mengembalikan nilai JSON sebagai teks yang ditunjukkan oleh elemen jalur yang dilewati sebagai "teks []" (setara dengan operator #>>). Silakan periksa dokumentasi PostgreSQL untuk informasi lebih lanjut. Di bawah ini ada contoh untuk Hibernate 5 dari metode yang mencari item yang berisi nilai string spesifik yang cocok dengan operator "seperti".
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 ();
}Untuk metode di atas, Hibernate akan menjalankan kueri HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_extract_path_text( generatedAlias0 . jsonbContent , :param0 ) like :param1SQL asli akan memiliki bentuk di bawah ini:
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 ?Untuk detail lebih lanjut dan contoh dengan operator atau cara menggunakan nilai numerik, silakan periksa DAO yang digunakan dalam tes.
Hibernate 6 Contoh :
Di bawah ada contoh yang sama seperti di atas tetapi untuk 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 ();
}Untuk detail lebih lanjut silakan periksa DAO yang digunakan dalam tes.
Jenis JSONBallArrayStringSexistPredicate mewakili predikat yang memeriksa apakah array string yang dilewatkan ada di properti array JSON. Contoh pertama untuk predikat ini adalah diperkenalkan di bagian "JSONBExtractPath - JSONB_EXTRACT_PATH". Predikat ini mengasumsikan bahwa fungsi SQL dengan nama default jsonb_all_array_strings_exist, yang disebutkan dalam bagian "Terapkan perubahan DDL" ada. Contoh di bawah ini dengan kombinasi dengan operator tidak menyajikan item yang tidak memiliki semua string yang dicari. Contohnya berlaku untuk Hibernate 5 saja!
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 ();
}Untuk metode di atas, Hibernate akan menjalankan kueri 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 asli akan memiliki bentuk di bawah ini:
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[?,?]) = falseHibernate 6 Contoh :
Di bawah ada contoh yang sama seperti di atas tetapi untuk 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 ();
}Untuk detail lebih lanjut silakan periksa DAO yang digunakan dalam tes.
Jenis JsonBanyArrayStringSexistPredicate mewakili predikat yang memeriksa apakah array string yang dilewatkan ada di properti array JSON. Predikat ini mengasumsikan bahwa fungsi SQL dengan nama default jsonb_any_array_strings_exist, yang disebutkan dalam bagian "Terapkan perubahan DDL" ada. Di bawah ini ada contoh metode yang mencari semua item yang properti yang memegang array berisi setidaknya satu string yang ditularkan dari array yang dilewatkan sebagai argumen metode. Contohnya berlaku untuk Hibernate 5 saja!
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 ();
}Untuk metode di atas, Hibernate akan menjalankan kueri 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)) = TRUESQL asli akan memiliki bentuk di bawah ini:
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[?,?]) = trueHibernate 6 Contoh :
Di bawah ada contoh yang sama seperti di atas tetapi untuk 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 ();
}Untuk detail lebih lanjut dan contoh dengan operator atau cara menggunakan nilai numerik, silakan periksa DAO yang digunakan dalam tes.
Perpustakaan juga dapat digunakan untuk operasi modifikasi JSON. Secara default, di Hibernate, kami selalu dapat memperbarui kolom dengan konten JSON dengan menetapkan seluruh nilainya. Perpustakaan PosjsonHelper juga memungkinkan Anda untuk memodifikasi konten JSON dengan mengatur, mengganti, atau menghapus properti JSON individu tanpa mengganti konten lengkapnya. Perpustakaan berisi beberapa fungsi dan operator JSON yang memungkinkan untuk jenis operasi ini.
Pembungkus untuk fungsi JSONB_SET. Fungsi tersebut menetapkan atau menggantikan nilai properti JSON berdasarkan jalur JSON. Lihat contoh berikut tentang bagaimana hal itu dapat digunakan dengan komponen CriteriaUpdate:
// 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 ());Ini akan menghasilkan pernyataan pembaruan SQL berikut:
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 = ?Fungsi ini juga dapat digunakan dalam pernyataan HQL, seperti pada contoh berikut:
@ 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 ();
}Pembungkus untuk operator gabungan. Pembungkus menggabungkan dua nilai JSONB menjadi nilai JSONB baru. Lihat contoh berikut tentang bagaimana hal itu dapat digunakan dengan komponen CriteriaUpdate:
// 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 ());Ini akan menghasilkan pernyataan pembaruan SQL berikut:
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 = ?Fungsi ini juga dapat digunakan dalam pernyataan HQL, seperti pada contoh berikut:
@ 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 untuk Menghapus Operator '#-'. Pembungkus menghapus bidang atau elemen array berdasarkan indeks pada jalur yang ditentukan, di mana elemen jalur dapat berupa kunci lapangan atau indeks array. Lihat contoh berikut tentang bagaimana hal itu dapat digunakan dengan komponen CriteriaUpdate:
// 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 ());Ini akan menghasilkan pernyataan pembaruan SQL berikut:
update
item
set
jsonb_content = (jsonb_content # - ?::text[])
where
id = ?Fungsi ini juga dapat digunakan dalam pernyataan HQL, seperti pada contoh berikut:
@ 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 ();
}Tipe RemeVeJsonValuesFromJSonArrayFunction adalah operator hibernasi yang memanggil fungsi SQL yang dihasilkan oleh PERPUSTAKAAN POSJSONHELPER. Secara default, fungsi yang dihasilkan terlihat seperti contoh di bawah ini:
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;Fungsi ini memiliki dua parameter input. Pertama adalah array JSON, yang merupakan array dasar untuk hasil bahwa fungsi akan kembali. Parameter kedua juga merupakan array JSON yang mewakili elemen yang harus dihapus dari array hasil. Di bawah ini adalah contoh kode tentang bagaimana fungsi ini dapat digunakan dengan operator lain untuk memperbarui kolom JSON dengan pernyataan pembaruan 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 " ]}" );Contoh yang sama tetapi dengan contoh kueri 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 " ]}" );Kedua contoh itu akan menghasilkan pernyataan SQL di bawah ini:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], remove_values_from_json_array(jsonb_extract_path(jsonb_content, ?), ?::jsonb))
where
id = ?Menggunakan fungsi JSONB_SET tunggal untuk mengatur properti tunggal untuk JSON dengan pernyataan pembaruan tunggal dapat bermanfaat, namun, mungkin lebih berguna untuk dapat mengatur beberapa properti di berbagai tingkat pohon JSON dengan satu pernyataan pembaruan.
Jangan cek kode di bawah ini:
// 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 " }}" );Dalam kode di atas, kami ingin menetapkan tiga properti json "anak -anak. Properti "orang tua" adalah properti baru yang seharusnya menjadi array. Meskipun pengaturan properti array baru dengan beberapa nilai dapat dilakukan dengan operasi tunggal, namun untuk tujuan demonstrasi kami menggunakan dua operasi. Salah satunya adalah untuk mengatur properti baru yang disebut "orang tua" dengan array JSON kosong sebagai nilai. Dan operasi lain yang menetapkan elemen array pada indeks tertentu. Jika properti yang lebih tinggi tidak ada maka harus dibuat sebelum properti dalam. Untungnya, instance default dari tipe Hibernate6JSonUpDateStatementBuilder memiliki komponen penyortiran dan penyaringan yang tepat untuk membantu Anda mengatur urutan operasi yang tepat. Jadi tidak masalah apakah kami menambahkan operasi elemen tambahan sebelum atau setelah menambahkan operasi create-array. Secara default, operasi yang menghapus konten akan ditambahkan sebelum yang menambah atau mengganti konten. Tentu saja, dimungkinkan untuk menonaktifkan perilaku ini dengan mengatur komponen -komponen ini menjadi nol. Untuk detail lebih lanjut, silakan periksa Javadoc untuk tipe Hibernate6jsonupDatestatementBuilder.
Kode ini menghasilkan pernyataan SQL di bawah ini:
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 = ?Eksekusi fungsi JSONB_SET paling dalam untuk pernyataan yang disiapkan ini akan menetapkan array kosong untuk properti "orang tua".
Pembangun memiliki metode untuk menetapkan nilai:
menghapus properti:
AppendDeletebySpecificPath (JSontextArray JSontexArArray)
Menambahkan elemen array
Menghapus elemen array
Beberapa metode yang terkait dengan modifikasi pada array JSON secara default memerlukan pustaka org.json.json (periksa dependensi opsional). Namun, dimungkinkan untuk melewati implementasi khusus antarmuka yang memetakan objek koleksi ke nilai array JSON dengan "withcollectiontoJsonArrayStringMapper (com.github.starnowski.posjsonhelper.hibernate6.hibernate6jsonupDatementBuilder.collectiontojsonArrayringmapper)"
Jenis Hibernate6jsonupDatestatementBuilder adalah generik. Jenis generik kedua adalah nilai khusus yang dapat ditambahkan ke konteks Hibernate6JSonUpDatestatementBuilder. Di bawah ini adalah contoh kode yang jenisnya mewakili operasi array (elemen yang harus ditambahkan dan dihapus dari array).
Jenis Nilai Kustom:
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 ;
}
}Contoh Penggunaan:
// 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 " ]}" );| Nama Properti | Keterangan |
|---|---|
| com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist | Nama fungsi SQL yang memeriksa apakah semua elemen yang disahkan sebagai teks [] ada di properti array JSON. Secara default, namanya adalah jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist | Nama fungsi SQL yang memeriksa apakah ada elemen yang disahkan sebagai teks [] ada di properti array JSON. Secara default, namanya adalah jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.functions.remove_values_from_json_array | Nama fungsi SQL yang mengembalikan array JSONB dengan menghapus elemen dari array JSONB disahkan sebagai input untuk fungsi. Secara default, namanya adalah Remove_Values_FROM_JSON_Array |
| com.github.starnowski.posjsonhelper.core.schema | Nama Skema Basis Data di mana fungsi SQL harus dibuat |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_all_array_strings_exist | Nama fungsi HQL yang memanggil fungsi SQL yang ditentukan oleh com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist Properti. Secara default, namanya adalah jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_any_array_strings_exist | Nama fungsi HQL yang memanggil fungsi SQL yang ditentukan oleh com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist Properti. Secara default, namanya adalah jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.json_function_json_array | Nama fungsi HQL yang membungkus operator array di PostgreSQL. Secara default, namanya adalah json_function_json_array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.remove_values_from_json_array | Nama fungsi HQL yang membungkus fungsi yang mengembalikan array JSONB dengan menghapus elemen dari array JSONB disahkan sebagai input untuk fungsi. Secara default, namanya adalah Remove_Values_FROM_JSON_Array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.sqldefinitionContextFactory.Types | Properti sistem yang menyimpan daftar com.github.starnowski.posjsonhelper.core.sql.isqldefinitionContextFactory tipe yang harus dimuat. Alih -alih memuat jenis yang dapat ditemukan di classpath untuk paket "com.github.starnowski.posjsonhelper". Jenis -jenis dalam daftar dipisahkan oleh karakter koma ".". |
| com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorregisterfactory.types | (Hanya digunakan dalam hibernate 6) Properti sistem yang menyimpan daftar com.github.starnowski.posjsonhelper.hibernate6.descriptor.functionDescriptorRegisterfactoriessupplier tipe yang harus dimuat. Alih -alih memuat jenis yang dapat ditemukan di classpath untuk paket "com.github.starnowski.posjsonhelper". Jenis -jenis dalam daftar dipisahkan oleh karakter koma ".". |
| com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorregisterfactory.types.excluded | (Hanya digunakan dalam hibernate 6) Properti sistem yang menyimpan daftar com.github.starnowski.posjsonhelper.hibernate6.descriptor.functionDescriptorregisterfactoriessupplier tipe yang harus dikecualikan dari pemuatan. Jika "com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorregisterfactory.types" Properti juga ditentukan kemudian "com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorregisterfactory.posjsonhelper.hibernate6.functionScriptorregisterfactory.types.exclud" haveFunction. Jenis -jenis dalam daftar dipisahkan oleh karakter koma ".". |
Matriks Kompatibilitas dengan Hibernate 6.
| PosjsonHelper | Hibernate 6 |
|---|---|
| 0.3.0 | 6.4.0.Final |
| 0.2.0 - 0.2.1 | 6.1.5.Final |
Masalah dengan paket, versi atau kelas hibernate dll.
Jika Anda menghadapi masalah yang terkait dengan definisi metode yang hilang atau ketik seperti misalnya:
java.lang.NoSuchMethodError: 'org.hibernate.query.criteria.JpaExpression
Kalau begitu, silakan periksa apakah proyek Anda memiliki perpustakaan hibernate-core di Classpath. Hibernate-core adalah ketergantungan opsional untuk proyek ini dan Anda harus memastikan bahwa itu ditambahkan dalam proyek Anda. Silakan periksa masalah serupa 145. Jika Anda hibernate-core ada di Classpath dan masalahnya masih ada maka silakan laporkan masalah.