Die PosjsonHelper Library ist ein Open-Source-Projekt, das die Hibernate-Abfrage für PostgreSQL JSON-Funktionen unterstützt. Die Bibliothek bietet auch Unterstützung für PostgreSQL -Textsuchfunktionen. Um mehr darüber zu erfahren, wie Textsuchkomponenten verwendet werden, überprüfen Sie die Anweisungen für das Textmodul. Die Bibliothek ist in einer Java -Programmiersprache geschrieben. Das Projekt für diesen Moment unterstützt Hibernate mit Version 5 und 6. Die erforderliche Version von Java ist mindestens Version 8 für Hibernate 5 Support und Version 11 für Hibernate 6.
Das Projekt ist im Central Maven -Repository erhältlich. Sie können es verwenden, indem Sie es als Abhängigkeit in der Projektdeskriptordatei (pom.xml) hinzufügen.
Für Hibernate 5:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate5</ artifactId >
< version >0.4.2</ version >
</ dependency >Für Hibernate 6:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate6</ artifactId >
< version >0.4.2</ version >
</ dependency >Die PosjsonHelper -Bibliothek hat keine vorübergehende Abhängigkeit von der Hibernate -Bibliothek. Beachten Sie also, dass Hibernate -Abhängigkeiten in Ihrem Projekt wie unten getrennt hinzugefügt werden müssen:
< dependency >
< groupId >org.hibernate</ groupId >
< artifactId >hibernate-core</ artifactId >
< version >????</ version >
</ dependency >Bitte überprüfen Sie die Hibernate -Kompatibilität -Versionsmatrix, um die richtige Version zu überprüfen.
Die Standardimplementierung für einige Funktionen im Zusammenhang mit den JSON -Operationen erfordern org.json: JSON -Bibliothek. Es gibt jedoch Möglichkeiten, bestimmte Schnittstellen zu implementieren, und die unterhalb der Bibliothek sind möglicherweise nicht hinzugefügt.
< dependency >
< groupId >org.json</ groupId >
< artifactId >json</ artifactId >
< version >20240303</ version >
</ dependency >Wenn jemand das Projekt lokal aus der Quelle erstellen möchte, sehen Sie sich die Datei mit der Mitarbeitern.md an, um zu überprüfen, wie das Projekt lokal eingerichtet wird.
Wichtig! Dieser Abschnitt gilt nur für Hibernate 5. Um die PosjsonHelper -Bibliothek im Projekt verwenden zu können, muss der korrekte Hibernate -Dialekt angegeben werden. Die Bibliothek implementiert nur wenige Wrapper, die bereits Hibernate -Dialekte für PostgreSQL existierten:
Der Dialekt muss beispielsweise in der Konfigurationsdatei in Hibernate festgelegt werden:
<? 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 >
...oder beispielsweise in der Datei Konfigurationseigenschaften der Spring Framework -Eigenschaften:
...
spring.jpa.properties.hibernate.dialect =com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper
...Falls Sie bereits einen Typ haben, der den Hibernate -Dialekttyp erweitert und für Ihr Projekt erforderlich ist. Sie fügen Ihren Typ Anpassung hinzu, damit sie die PostgreSQLDIALECTENRicher -Komponente verwenden.
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 );
}
}Wichtig! Dieser Abschnitt gilt nur für Hibernate 6. Um die PosjsonHelper -Bibliothek in dem Projekt zu verwenden, das Hibernate 6 verwendet, muss es eine bestimmte org.hiberNate.boot.model.FunctionContributor -Implementierung geben. Die Bibliothek verfügt über die Implementierung dieser Schnittstelle, dh com.github.starnowski.posjsonhelper.hibernate6.posjsonHelperFunctionContribributor.
Um diese Implementierung zu verwenden, muss die Datei mit dem Namen "org.hibernate.boot.model.FunctionConTributor" unter "Ressourcen/Meta-Inf/Services" -Verzeichnung erstellt werden.
Die alternative Lösung besteht darin, com.github.starnowski.posjsonhelper.hibernate6.sqmfunctionRegistryEnricher-Komponente während des Anwendungsstarts zu verwenden. Wie im folgenden Beispiel mit der Verwendung des Frühlingsgerüsts.
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 ());
}
}Um die PosjsonHelper -Bibliothek zu verwenden, müssen einige SQL -Funktionen erstellt werden, mit denen JSON -Operatoren ausgeführt werden. Einige JSON -Operatoren können nicht von Winterschlafum ausgeführt werden, da sie entkommen werden müssen. Für eine Standardkonfiguration verlangt die Bibliothek, dass die folgenden Funktionen erstellt werden müssen.
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;Die generierte DDL -Anweisung kann während Integrationstests ausgeführt oder von Tools verwendet werden, die Änderungen an der Datenbank anwenden, wie Liquibase oder Flyway. Wichtig! Wenn es erforderlich wäre, eine ähnliche Funktion zu verwenden, jedoch mit unterschiedlichen Namen, muss dies in Anwendungseigenschaften angegeben werden. Es ist erforderlich, weil die Typen den Hibernate-Dialekttyp erweitern, der im Abschnitt ["So-to-postgresql-Dialekt" (#-How-to-attach-postgreSQL) erwähnt wird, hat möglicherweise keinen Zugriff auf den Anwendungskontext (IOC). Wenn jedoch solche Eigenschaften auf unterschiedliche Weise übergeben werden sollten, hat der PostgreSQLDIALECTENRicher -Typ auch die Methode, um Kontextobjekte zu übergeben (bitte überprüfen Sie den Kernkontext und den Hibernate -Kontext).
Die Kontextklasse enthält Namen von Funktionen, die in der Bibliothek verwendet werden. Die Dialektklassen verwenden CoreContextPropertieStupplier -Komponente, die ein Kontextobjekt basierend auf der Systemeigenschaft generieren.
Es ist auch möglich, DDL mithilfe von DataBaseoperationExecutorFacade -Typen programmgesteuert hinzuzufügen. Unten finden Sie Beispiele, wie Sie DDL -Änderungen in der Anwendung mit Spring Framework -Kontext anwenden.
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 );
}
}
}Es gibt einige Vorgänge, die vom DataBaseoperationExecutorFacade -Objekt ausgeführt werden können
| Eigenschaftsname | Beschreibung |
|---|---|
| ERSTELLEN | Wendet DDL -Änderungen in die Datenbank an |
| BESTÄTIGEN | Validiert, wenn DDL -Änderungen auf die Datenbank angewendet wurden |
| FALLEN | DDL -Änderungen in der Datenbank fallen |
| Log_all | Zeigt DDL -Skripte zum Erstellen, Validieren und Drop -Operationen an |
Nehmen wir an, wir haben eine Datenbanktabelle mit einer Spalte, die den JSONB -Typ speichert.
create table item (
id int8 not null ,
jsonb_content jsonb,
primary key (id)
)Für diese Tabelle können wir Zeile mit jedem JSON einfügen, wie in Beispiel unten:
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"} ' );Die meisten Prädikatkomponenten verwenden das Hibernate -Kontextobjekt. Es enthält hauptsächlich die Namen der im Projekt verwendeten Hibernate -Funktionsnamen. Die Dialektklassen und der Funktion "FunktionConTributor Typ verwenden" HibernateContextPropertieSPlier -Komponente, die das HibernateContext -Objekt basierend auf der Systemeigenschaft generiert. Wenn keine Standard -HQL -Funktionsnamen für PsojsonHelper -Operatoren geändert werden müssen, wird HibernateContext verwendet, die von Builder -Komponenten erstellt wurden, wie unten:
HibernateContext hibernateContext = HibernateContext . builder (). build ();Die "jsonb_extract_path" ist postGresql -Funktion, die den JSONB -Wert zurückgibt, auf das von Pfadelementen als "text []" (gleichwertig zu #> Operator) übergeben wird. Es ist nützlich, weil viele Funktionen den Typ "JSONB" zur Ausführung verwenden. Bitte überprüfen Sie die Dokumentation von PostgreSQL, um weitere Informationen zu erhalten. Hibernate 5 Beispiel : Unten gibt es ein Beispiel für eine Methode, die eine Liste von Elementenobjekten zurückgibt, für die JSON -Inhaltseigenschaft "top_element_with_set_of_values" eine genaue Wertemenge enthält. Das Beispiel verwendet 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 ();
}Für die obige Methode wird Hibernate die HQL -Abfrage ausführen:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_all_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1)) = TRUENative SQL wird unterhalb des Formulars haben:
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[?]) = trueWeitere Informationen finden Sie in den in Tests verwendeten DAO.
Hibernate 6 Beispiel :
Unten gibt es das gleiche Beispiel wie oben, aber für 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 ();
}Weitere Informationen finden Sie in den in Tests verwendeten DAO.
Die "JSONB_EXTRACT_PATH_TEXT" ist postGreSQL -Funktion, die den JSON -Wert zurückgibt, auf das von Pfadelementen als "text []" (gleichwertig zu #>> Operator) hingewiesen wird. Bitte überprüfen Sie die Dokumentation von PostgreSQL, um weitere Informationen zu erhalten. Unten finden Sie ein Beispiel für Hibernate 5 einer Methode, die nach Elementen sucht, die bestimmte Zeichenfolgewerte enthalten, die vom Operator "Gefällt mir" übereinstimmen.
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 ();
}Für die obige Methode wird Hibernate die HQL -Abfrage ausführen:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_extract_path_text( generatedAlias0 . jsonbContent , :param0 ) like :param1Native SQL wird unterhalb des Formulars haben:
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 ?Weitere Details und Beispiele zum In -Operator oder bei der Verwendung von numerischen Werten überprüfen Sie bitte die in Tests verwendeten DAO.
Hibernate 6 Beispiel :
Unten gibt es das gleiche Beispiel wie oben, aber für 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 ();
}Weitere Informationen finden Sie in den in Tests verwendeten DAO.
Der JsonBallArrayStringSexistPredicate -Typ stellt Prädikat dar, das prüft, ob in der Eigenschaft JSON Array bestehen, wenn String -Arrays vorhanden sind. Das erste Beispiel für dieses Prädikat war der Abschnitt "JSONBextractPath - JSONB_EXTRACT_PATH". Diese Prädikate gehen davon aus, dass die SQL -Funktion mit dem Standardnamen jsonb_all_array_strings_exist, im Abschnitt "DDL -Änderungen anwenden" erwähnt wird, existiert. Das folgende Beispiel mit einer Kombination mit dem Bediener enthält keine Elemente, bei denen nicht alle durchsuchten Zeichenfolgen verfügen. Beispiel gültig für Hibernate 5 nur!
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 ();
}Für die obige Methode wird Hibernate die HQL -Abfrage ausführen:
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
)Native SQL wird unterhalb des Formulars haben:
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 Beispiel :
Unten gibt es das gleiche Beispiel wie oben, aber für 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 ();
}Weitere Informationen finden Sie in den in Tests verwendeten DAO.
Der JsonBanyarrayStringSexistPredicate -Typ stellt ein Prädikat dar, das prüft, ob in der Eigenschaft JSON Array bestehende String -Arrays vorhanden sind. Diese Prädikate gehen davon aus, dass die SQL -Funktion mit dem Standardnamen jsonb_any_array_strings_exist, im Abschnitt "DDL -Änderungen anwenden" erwähnt wird, existiert. Im Folgenden finden Sie ein Beispiel für eine Methode, die nach allen Elementen sucht, die das Array enthält, mindestens eine Zeichenfolge, die aus dem Array als Methodenargument übergeben wurde. Beispiel gültig für Hibernate 5 nur!
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 ();
}Für die obige Methode wird Hibernate die HQL -Abfrage ausführen:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_any_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1, :param2)) = TRUENative SQL wird unterhalb des Formulars haben:
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 Beispiel :
Unten gibt es das gleiche Beispiel wie oben, aber für 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 ();
}Weitere Details und Beispiele zum In -Operator oder bei der Verwendung von numerischen Werten überprüfen Sie bitte die in Tests verwendeten DAO.
Die Bibliothek kann auch für JSON -Modifikationsvorgänge verwendet werden. In Hibernate können wir standardmäßig eine Spalte mit JSON -Inhalten aktualisieren, indem wir ihren gesamten Wert festlegen. Mit der PosjsonHelper -Bibliothek können Sie auch JSON -Inhalte ändern, indem Sie einzelne JSON -Eigenschaften einstellen, ersetzen oder entfernen, ohne den vollständigen Inhalt zu ersetzen. Die Bibliothek enthält mehrere JSON -Funktionen und Operatoren, die diese Art von Betrieb ermöglichen.
Wrapper für JSONB_SET -Funktion. Die Funktion legt den Wert der JSON -Eigenschaft basierend auf dem JSON -Pfad fest oder ersetzt. Schauen Sie sich das folgende Beispiel dafür an, wie es mit der Kriterienkomponente verwendet werden kann:
// 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 ());Dies würde die folgende SQL -Update -Anweisung generieren:
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 = ?Die Funktion kann auch in HQL -Anweisungen verwendet werden, wie im folgenden Beispiel:
@ 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 für Verkettungsoperator. Der Wrapper verkettet zwei JSONB -Werte zu einem neuen JSONB -Wert. Schauen Sie sich das folgende Beispiel dafür an, wie es mit der Kriterienkomponente verwendet werden kann:
// 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 ());Dies würde die folgende SQL -Update -Anweisung generieren:
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 = ?Die Funktion kann auch in HQL -Anweisungen verwendet werden, wie im folgenden Beispiel:
@ 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 für Löschbetreiber '#-'. Der Wrapper löscht das Feld oder das Array -Element basierend auf dem Index am angegebenen Pfad, wobei Pfadelemente entweder Feldschlüssel oder Array -Indizes sein können. Schauen Sie sich das folgende Beispiel dafür an, wie es mit der Kriterienkomponente verwendet werden kann:
// 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 ());Dies würde die folgende SQL -Update -Anweisung generieren:
update
item
set
jsonb_content = (jsonb_content # - ?::text[])
where
id = ?Die Funktion kann auch in HQL -Anweisungen verwendet werden, wie im folgenden Beispiel:
@ 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 ();
}Der Typ von REMETJSONVALUESFROMJSONArrayFunction ist ein Winterschlafbetreiber, der die von der PosjsonHelper -Bibliothek generierte SQL -Funktion aufruft. Standardmäßig sieht die generierte Funktion wie das folgende Beispiel aus:
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;Die Funktion hat zwei Eingabeparameter. Erstens ist das JSON -Array, das ein Basisarray für das Ergebnis ist, dass die Funktion zurückkehrt. Der zweite Parameter ist auch ein JSON -Array, das ein Element darstellt, das aus dem Ergebnisarray entfernt werden sollte. Im Folgenden finden Sie ein Code -Beispiel dafür, wie diese Funktion mit einem anderen Bediener verwendet werden kann, um JSON -Spalten mit der SQL -Update -Anweisung zu aktualisieren.
// 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 " ]}" );Das gleiche Beispiel, aber mit Beispiel für HQL -Abfrage:
// 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 " ]}" );Diese beiden Beispiele werden nachstehend SQL -Anweisung generieren:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], remove_values_from_json_array(jsonb_extract_path(jsonb_content, ?), ?::jsonb))
where
id = ?Wenn Sie eine einzelne JSONB_SET -Funktion verwenden, um eine einzelne Eigenschaft für JSON mit einer einzelnen Update -Anweisung festzulegen, kann es jedoch nützlicher sein. Es kann jedoch nützlicher sein, mehrere Eigenschaften auf verschiedenen Ebenen des JSON -Baums mit einer einzigen Aktualisierungsanweisung festzulegen.
Damit wird der folgende Code -Beispiel überprüfen:
// 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 " }}" );Im obigen Code möchten wir drei JSON -Eigenschaften "Child.Birthday", "Child.Pets" und "Eltern" festlegen und zwei weitere "Inventory.0" und "Spicknames.Childhood" löschen. Das Eigentum "Eltern" ist ein neues Eigentum, das ein Array sein soll. Obwohl die Einstellung der Neuarray -Eigenschaft mit einigen Werten mit einem einzigen Betrieb erfolgen könnte, verwenden wir jedoch für den Demonstrationszweck zwei Operationen. Eine davon ist für die Einstellung einer neuen Eigenschaft namens "Eltern" mit leerem JSON -Array als Wert. Und eine andere Operation, die das Element eines Arrays auf einem bestimmten Index festlegt. Wenn keine höhere Eigenschaft vorliegt, muss sie vor inneren Eigenschaften erstellt werden. Glücklicherweise verfügt die Standardinstanz des Hibernate6jsonUpDatestatementBuilder -Typs entsprechende Sortier- und Filterkomponenten, mit denen Sie die richtige Reihenfolge der Operationen festlegen können. Es spielt also keine Rolle, ob wir den add-array-Element-Operation vor oder nach dem Hinzufügen des Create-Array-Vorgangs hinzufügen. Standardmäßig werden Vorgänge, die Inhalte löschen, vor denen hinzugefügt, die Inhalte hinzufügen oder ersetzen. Natürlich ist es möglich, dieses Verhalten zu deaktivieren, indem diese Komponenten auf Null gesetzt werden. Weitere Informationen finden Sie in Javadoc für Hibernate6jsonUpDatestatementBuilder -Typ.
Dieser Code generiert unten SQL Anweisung:
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 = ?Die innere Ausführung von JSONB_SET -Funktion für diese vorbereitete Anweisung besteht darin, ein leeres Array für die Eigenschaft "Eltern" festzulegen.
Der Bauherr verfügt über Methoden zum Festlegen von Werten:
Eigenschaften entfernen:
appendDeletebyspecificPath (JsonTextArray JsonTextArray)
Hinzufügen von Array -Elementen
Entfernen von Array -Elementen
Einige Methoden zur Änderung des JSON -Arrays standardmäßig erfordern org.json.json Library (optionale Abhängigkeiten überprüfen). Es ist jedoch möglich, eine benutzerdefinierte Implementierung der Schnittstelle zu übergeben, die das Sammlungsobjekt an den JSON -Array -Wert mit "WithCollectiontojsonArrayStringMapper (com.github.starnowski.posjsonhelper.hiberNate6.hibernate6jsonUpDatestatementBuilder.CollectiontojsonArraystringMapPer)" Breoders methodementbuilder.colctiontojsonArrayStraystringMapPer) abbiegt.
Der Hibernate6jsonUpDatestatementBuilder -Typ ist generisch. Ein zweiter generischer Typ ist ein benutzerdefinierter Wert, der dem Hibernate6jsonUpDatestatementBuilder -Kontext hinzugefügt werden kann. Im Folgenden finden Sie ein Code -Beispiel, dessen Typ Array -Operationen darstellt (Elemente, die zu einem Array hinzugefügt und entfernt werden sollten).
Benutzerdefinierte Werttyp:
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 ;
}
}Verwendungsbeispiel:
// 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 " ]}" );| Eigenschaftsname | Beschreibung |
|---|---|
| com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist | Name der SQL -Funktion, die überprüft, ob alle Elemente als Text [] in der JSON -Array -Eigenschaft vorhanden sind. Standardmäßig ist der Name der jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist | Name der SQL -Funktion, die überprüft, ob in der JSON -Array -Eigenschaft Elemente als Text [] bestehen. Standardmäßig ist der Name der jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.functions.remove_values_from_json_array | Name der SQL -Funktion, die das JSONB -Array zurückgibt, indem Elemente aus JSONB -Array als Eingabe für die Funktion gelöscht werden. Standardmäßig ist der Name der REDE_VALUES_FROM_JSON_Array |
| com.github.starnowski.posjsonhelper.core.schema | Name des Datenbankschemas, bei dem die SQL -Funktionen erstellt werden sollten |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_all_array_strings_exist | Name der HQL -Funktion, die von der SQL -Funktion aufgerufen wird, die durch die Com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exists Eigenschaft angegeben ist. Standardmäßig ist der Name der jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_any_array_strings_exist | Name der HQL -Funktion, die die von der Com.github.Starnowski.PosjsonHelper.core.Core.Functions.jsonb_any_Array_Strings_Exists Eigenschaft angegebene SQL -Funktion auffordert. Standardmäßig ist der Name der jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.json_function_json_array | Name der HQL -Funktion, die den Array -Operator in PostgreSQL umhüllt. Standardmäßig ist der Name der json_function_json_array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.remove_values_from_json_array | Name der HQL -Funktion, die Funktionsfunktion, die das JSONB -Array zurückgibt, indem Elemente aus JSONB -Array als Eingabe für die Funktion gelöscht werden. Standardmäßig ist der Name der REDE_VALUES_FROM_JSON_Array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.sqldefinitionContextFactory.types | Systemeigenschaft, die Liste von com.github.starnowski.posjsonhelper.core.sql.isqldefinitionContextFactory -Typen speichert, die geladen werden sollten. Anstatt Typen zu laden, die auf dem Klassenpfad "com.github.starnowski.posjsonhelper" zu finden sind. Typen auf der Liste sind durch Komma -Charakter ".". |
| com.github.starnowski.posjsonhelper.hibernate6.FunctionDescriptorregisterFactory.types | (Verwendet nur in Hibernate 6) Systemeigenschaft, die die Liste von com.github.starnowski.posjsonhelper.hibernate6.Descriptor.FunktionDescriptorRegisterFactorieSupplier -Typen speichert. Anstatt Typen zu laden, die auf dem Klassenpfad "com.github.starnowski.posjsonhelper" zu finden sind. Typen auf der Liste sind durch Komma -Charakter ".". |
| com.github.starnowski.posjsonhelper.hibernate6.FunctionDescriptorregisterFactory.types.Excluded | (Verwendet nur in Hibernate 6) Systemeigenschaft, die Liste von com.github.starnowski.posjsonhelper.hibernate6.Descriptor.funktionDescriptorRegisterFactorieSupplier -Typen gespeichert, die vom Laden ausgeschlossen werden sollten. Wenn "com.github.starnowski.posjsonhelper.hiNNATE6.FunktionDescriptorRegisterFactory.types" -Spertion "ist ebenfalls angegeben" com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRepractory.type.types.types Typen auf der Liste sind durch Komma -Charakter ".". |
Kompatibilitätsmatrix mit Hibernate 6.
| PosjsonHelper | Hibernate 6 |
|---|---|
| 0.3.0 | 6.4.0.finale |
| 0.2.0 - 0.2.1 | 6.1.5.finale |
Problem mit Hibernate -Paket, Version oder Klassen usw.
Wenn Sie sich mit dem Problem im Zusammenhang mit fehlender Methodendefinition oder Typen wie zum Beispiel stellen:
java.lang.NoSuchMethodError: 'org.hibernate.query.criteria.JpaExpression
Dann prüfen Sie zuerst, ob Ihr Projekt Hibernate-Core-Bibliothek auf Klassenpfad hat. Der Hibernate-Core ist eine optionale Abhängigkeit für dieses Projekt und Sie müssen sicherstellen, dass es in Ihrem Projekt hinzugefügt wurde. Bitte überprüfen Sie ähnliches Problem 145. Wenn Sie den Hibernate-Core auf Klassenpfad haben und das Problem weiterhin besteht, melden Sie bitte das Problem.