La bibliothèque Posjsonhelper est un projet open-source qui ajoute la prise en charge de la requête Hibernate pour les fonctions JSON Postgresql. La bibliothèque prend également en charge les fonctions de recherche de texte PostgreSQL. Pour en savoir plus sur la façon d'utiliser les composants de recherche de texte, vérifier les instructions du module de texte. La bibliothèque est écrite dans un langage de programmation Java. Le projet pour ce moment prend en charge Hibernate avec les version 5 et 6. La version requise de Java est au moins la version 8 pour la prise en charge Hibernate 5 et la version 11 pour Hibernate 6.
Le projet est disponible dans le référentiel Maven Central. Vous pouvez l'utiliser simplement en l'ajoutant comme dépendance dans le fichier de descripteur de projet (POM.xml).
Pour Hibernate 5:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate5</ artifactId >
< version >0.4.2</ version >
</ dependency >Pour Hibernate 6:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate6</ artifactId >
< version >0.4.2</ version >
</ dependency >La bibliothèque Posjsonhelper n'a pas de dépendance transitoire à la bibliothèque Hibernate. Alors s'il vous plaît, à l'esprit, que la dépendance à l'hibernate doit être ajoutée séparément dans votre projet comme ci-dessous:
< dependency >
< groupId >org.hibernate</ groupId >
< artifactId >hibernate-core</ artifactId >
< version >????</ version >
</ dependency >Veuillez vérifier la matrice de version de compatibilité Hibernate pour vérifier la version correcte.
L'implémentation par défaut pour certaines fonctionnalités liées aux opérations JSON nécessite Org.json: bibliothèque JSON. Cependant, il existe des moyens d'installer des interfaces spécifiques et la bibliothèque ci-dessous peut ne pas être nécessaire pour ajouter.
< dependency >
< groupId >org.json</ groupId >
< artifactId >json</ artifactId >
< version >20240303</ version >
</ dependency >Si quelqu'un souhaite construire le projet localement à partir de la source, veuillez consulter le fichier contribution.md pour vérifier comment configurer le projet localement.
Important! Cette section n'est valable que pour Hibernate 5. Pour pouvoir utiliser la bibliothèque Posjsonhelper dans le projet, il faut spécifier le dialecte d'hibernate correct. La bibliothèque implémente quelques emballages qui étendent déjà des dialectes d'hibernate pour PostgreSQL:
Le dialecte doit être défini dans le fichier de configuration Hibernate par exemple:
<? 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 >
...ou par exemple dans le fichier de propriétés de configuration de Spring Framework:
...
spring.jpa.properties.hibernate.dialect =com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper
...Dans le cas où vous avez déjà un type qui étend le type de dialecte hibernate et qu'il est nécessaire pour votre projet. Vous ajoutez un ajustement à votre type afin qu'il utilise le composant postgresqldialectenricher.
import com . github . starnowski . posjsonhelper . hibernate5 . PostgreSQLDialectEnricher ;
import org . hibernate . dialect . PostgreSQL95Dialect ;
public class PostgreSQLDialectWithDifferentSchema extends PostgreSQL95Dialect {
public PostgreSQLDialectWithDifferentSchema () {
PostgreSQLDialectEnricher enricher = new PostgreSQLDialectEnricher ();
enricher . enrich ( this );
}
}Important! Cette section n'est valable que pour Hibernate 6. Pour utiliser la bibliothèque Posjsonhelper dans le projet qui utilise Hibernate 6, il doit y avoir une implémentation spécifiée org.hibernate.boot.model.functionContrutor. La bibliothèque a l'implémentation de cette interface, c'est com.github.starnowski.posjsonhelper.hibernate6.posjsonhelperfunctionContrutor.
Pour utiliser cette implémentation, il est nécessaire de créer un fichier avec le nom "org.hibernate.boot.model.functionContrutor" dans le répertoire "Resources / Meta-Inf / Services".
La solution alternative consiste à utiliser com.github.starnowski.posjsonhelper.hibernate6.sqmfunctionRegistryenRicher lors du démarrage de l'application. Comme dans l'exemple ci-dessous avec l'utilisation du framework Spring.
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 ());
}
}Pour utiliser la bibliothèque Posjsonhelper, il est nécessaire de créer quelques fonctions SQL qui exécutent des opérateurs JSON. Certains opérateurs JSON ne peuvent pas être exécutés par Hibernate car ils doivent être échappés. Pour une configuration par défaut, la bibliothèque nécessite la création des fonctions ci-dessous.
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;L'instruction DDL générée peut être exécutée lors des tests d'intégration ou utilisées par des outils qui appliquent des modifications à la base de données, comme Liquibase ou Flyway. Important! S'il y aurait besoin d'utiliser une fonction similaire mais avec différents noms, cela doit être spécifié dans les propriétés d'application. Il est requis car les types étendent le type de dialecte hibernate, mentionné dans la section [comment joindre le dialect postgresql "] (# comment-attach-PostgreSql Dialect) peut ne pas avoir accès au contexte de l'application (IOC). Cependant, dans le cas où ces propriétés devraient être transmises de manière différente, le type postgresqldialectenricher a également une méthode pour passer des objets de contexte (veuillez vérifier le contexte central et le contexte d'hibernate)
La classe de contexte contient des noms des fonctions utilisées par la bibliothèque. Les classes de dialecte utilisent le composant CoreContextProperTesupplier qui génère un objet contextuel en fonction de la propriété système.
Il est également possible d'ajouter du DDL par programme en utilisant le type de base d'Oeperation ExecutorFacade. Ci-dessous, il existe un exemple sur la façon d'appliquer les modifications DDL dans l'application avec le contexte de 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 );
}
}
}Il y a quelques opérations qui peuvent être exécutées par l'objet de base de base de l'ExecutorFacade
| Nom de propriété | Description |
|---|---|
| CRÉER | Applique des modifications DDL à la base de données |
| VALIDER | Valide si des modifications DDL ont été appliquées à la base de données |
| BAISSE | Drop Changement DDL dans la base de données |
| Log_all | Affiche les scripts DDL pour les opérations de création, de validation et de dépôt |
Pour une explication plus facile, supposons que nous avons une table de base de données avec une colonne qui stocke le type JSONB.
create table item (
id int8 not null ,
jsonb_content jsonb,
primary key (id)
)Pour ce tableau, nous pouvons insérer une ligne avec n'importe quel JSON, comme dans l'exemple ci-dessous:
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"} ' );La plupart des composants de prédicat utilisent l'objet de contexte hibernate. Il contient principalement les noms des noms de fonction Hibernate utilisés dans le projet. Les classes de dialect et le type de contrôle de fonction utilisent le composant HiberNateContextProperTesUpplier qui génère un objet HiberNateContext basé sur la propriété système. S'il n'est pas nécessaire de modifier les noms de fonction HQL par défaut pour les opérateurs de psojsonhelper, il s'agit même d'utiliser HiberNateContext créé par le composant Builder comme ci-dessous:
HibernateContext hibernateContext = HibernateContext . builder (). build ();La fonction "jsonb_extract_path" est la fonction postgresql qui renvoie la valeur JSONB pointée par les éléments de chemin passé comme "texte []" (équivalent à #> opérateur). Il est utile car de nombreuses fonctions utilisent le type "JSONB" pour l'exécution. Veuillez consulter la documentation PostgreSQL pour plus d'informations. Hibernate 5 Exemple : ci-dessous, il existe un exemple de méthode qui renvoie une liste d'objets d'éléments pour lesquels la propriété de contenu JSON "top_element_with_set_of_values" contient un ensemble exact de valeurs. L'exemple utilise 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 ();
}Pour la méthode ci-dessus, HiberNate exécutera la requête HQL:
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 va avoir un formulaire ci-dessous:
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[?]) = truePour plus de détails, veuillez vérifier le DAO utilisé dans les tests.
Hibernate 6 Exemple :
Ci-dessous, il y a le même exemple que ci-dessus mais pour 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 ();
}Pour plus de détails, veuillez vérifier le DAO utilisé dans les tests.
La fonction "JSONB_Extract_Path_text" est la fonction PostgreSQL qui renvoie la valeur JSON en tant que texte indiqué par les éléments de chemin passé comme "texte []" (équivalent à # >> opérateur). Veuillez consulter la documentation PostgreSQL pour plus d'informations. Ci-dessous, il y a un exemple pour Hibernate 5 d'une méthode qui recherche des éléments contenant des valeurs de chaîne spécifiques correspondant à l'opérateur "like".
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 ();
}Pour la méthode ci-dessus, HiberNate exécutera la requête HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_extract_path_text( generatedAlias0 . jsonbContent , :param0 ) like :param1Native SQL va avoir un formulaire ci-dessous:
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 ?Pour plus de détails et d'exemples avec l'opérateur in ou comment utiliser les valeurs numériques, veuillez vérifier le DAO utilisé dans les tests.
Hibernate 6 Exemple :
Ci-dessous, il y a le même exemple que ci-dessus mais pour 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 ();
}Pour plus de détails, veuillez vérifier le DAO utilisé dans les tests.
Le type JSONAllArrayStringSExistPredicate représente le prédicat que les vérifications si des tableaux de chaînes passaient existent dans la propriété JSON Array. Le premier exemple de ce prédicat a été introduit dans la section "JSONBExtractPath - JSONB_EXTRAT_PATH". Ces prédicats supposent que la fonction SQL avec le nom par défaut JSONB_ALL_ARRAY_STRINGS_EXIST, mentionné dans la section "Appliquer les modifications DDL" existe. L'exemple ci-dessous avec une combinaison avec l'opérateur ne présente pas les éléments qui n'ont pas toutes les chaînes recherchées. Exemple valide pour Hibernate 5 seulement!
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 ();
}Pour la méthode ci-dessus, HiberNate exécutera la requête 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
)Native SQL va avoir un formulaire ci-dessous:
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 Exemple :
Ci-dessous, il y a le même exemple que ci-dessus mais pour 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 ();
}Pour plus de détails, veuillez vérifier le DAO utilisé dans les tests.
Le type JSONBanyArrayStringSExistPredicate représente un prédicat que les vérifications si des tableaux de chaîne passaient dans la propriété JSON Array. Ces prédicats supposent que la fonction SQL avec le nom par défaut JSONB_ANY_ARRAY_STRINGS_EXIST, mentionné dans la section "Appliquer les modifications DDL" existe. Ci-dessous, il existe un exemple de méthode qui recherche tous les éléments qui contient le tableau contient au moins une chaîne passée du tableau passé comme argument de méthode. Exemple valide pour Hibernate 5 seulement!
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 ();
}Pour la méthode ci-dessus, HiberNate exécutera la requête 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)) = TRUENative SQL va avoir un formulaire ci-dessous:
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 Exemple :
Ci-dessous, il y a le même exemple que ci-dessus mais pour 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 ();
}Pour plus de détails et d'exemples avec l'opérateur in ou comment utiliser les valeurs numériques, veuillez vérifier le DAO utilisé dans les tests.
La bibliothèque peut également être utilisée pour les opérations de modification JSON. Par défaut, dans Hibernate, nous pouvons toujours mettre à jour une colonne avec le contenu JSON en définissant toute sa valeur. La bibliothèque Posjsonhelper vous permet également de modifier le contenu JSON en définissant, en remplaçant ou en supprimant les propriétés JSON individuelles sans remplacer son contenu complet. La bibliothèque contient plusieurs fonctions et opérateurs JSON qui permettent ce type d'opération.
Wrapper pour la fonction JSONB_SET. La fonction définit ou remplace la valeur de la propriété JSON en fonction du chemin JSON. Consultez l'exemple suivant de la façon dont il peut être utilisé avec le composant critère de l'adhésion:
// 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 ());Cela générerait l'instruction SQL de mise à jour suivante:
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 = ?La fonction peut également être utilisée dans les instructions HQL, comme dans l'exemple suivant:
@ 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 ();
}Emballage pour l'opérateur de concaténation. Le wrapper concatenate deux valeurs JSONB dans une nouvelle valeur JSONB. Consultez l'exemple suivant de la façon dont il peut être utilisé avec le composant critère de l'adhésion:
// 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 ());Cela générerait l'instruction SQL de mise à jour suivante:
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 = ?La fonction peut également être utilisée dans les instructions HQL, comme dans l'exemple suivant:
@ 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 pour Deletes Operator '# -'. Le wrapper supprime l'élément de champ ou de tableau en fonction de l'index sur le chemin spécifié, où les éléments de chemin peuvent être des touches de champ ou des index de tableau. Consultez l'exemple suivant de la façon dont il peut être utilisé avec le composant critère de l'adhésion:
// 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 ());Cela générerait l'instruction SQL de mise à jour suivante:
update
item
set
jsonb_content = (jsonb_content # - ?::text[])
where
id = ?La fonction peut également être utilisée dans les instructions HQL, comme dans l'exemple suivant:
@ 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 ();
}Le type de rejetJSonValuesFromJSonArrayFunction est un opérateur Hibernate qui invoque la fonction SQL générée par la bibliothèque Posjsonhelper. Par défaut, la fonction générée ressemble à l'exemple ci-dessous:
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;La fonction a deux paramètres d'entrée. Le premier est le tableau JSON, qui est un tableau de base pour le résultat que la fonction reviendra. Le deuxième paramètre est également un tableau JSON qui représente un élément qui doit être supprimé du tableau de résultat. Vous trouverez ci-dessous un exemple de code de la façon dont cette fonction peut être utilisée avec un autre opérateur pour mettre à jour les colonnes JSON avec l'instruction SQL Update.
// 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 " ]}" );Le même exemple mais avec l'exemple de requête 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 " ]}" );Ces deux exemples vont générer ci-dessous l'instruction SQL:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], remove_values_from_json_array(jsonb_extract_path(jsonb_content, ?), ?::jsonb))
where
id = ?L'utilisation d'une seule fonction JSONB_SET pour définir une seule propriété pour JSON avec une seule instruction de mise à jour peut être utile, mais il peut être plus utile de pouvoir définir plusieurs propriétés à différents niveaux de l'arborescence JSON avec une seule instruction de mise à jour.
Exemple de code ci-dessous de vérification:
// 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 " }}" );Dans le code ci-dessus, nous voulons définir trois propriétés JSON "child.birthday", "child.pets" et "parents" et supprimer deux autres, "Inventory.0" et "surnoms.childhood". La propriété "parents" est une nouvelle propriété qui supposait être un tableau. Bien que la définition de la nouvelle propriété Array avec certaines valeurs puisse être effectuée avec une seule opération, mais à des fins de démonstration, nous utilisons deux opérations. L'un est destiné à définir une nouvelle propriété appelée "parents" avec un tableau JSON vide en valeur. Et une autre opération qui définit l'élément d'un tableau à un index spécifique. Si une propriété supérieure n'existe pas, elle doit être créée avant les propriétés internes. Heureusement, l'instance par défaut du type HiberNate6JSonUpDateStAlementBuilder a des composants de tri et de filtrage appropriés pour vous aider à définir le bon ordre d'opérations. Peu importe que nous ajoutons l'opération de terrasse complémentaire avant ou après l'ajout de l'opération de création de création. Par défaut, les opérations qui suppriment le contenu seront ajoutées avant celles qui ajoutent ou remplacent le contenu. Bien sûr, il est possible de désactiver ce comportement en définissant ces composants NULL. Pour plus de détails, veuillez consulter Javadoc pour HiberNate6JSonUpDateStatementBuilder Type.
Ce code génère ci-dessous l'instruction SQL:
update
item
set
jsonb_content =
jsonb_set(
jsonb_set(
jsonb_set(
jsonb_set(
(
(jsonb_content # - ?::text[]) -- the most nested #- operator
# - ?::text[])
, ?:: text [], ?::jsonb) -- the most nested jsonb_set operation
, ?:: text [], ?::jsonb)
, ?:: text [], ?::jsonb)
, ?:: text [], ?::jsonb)
where
id = ?L'exécution de la fonction JSONB_SET la plus intérieure pour cette instruction préparée va définir un tableau vide pour la propriété "Parents".
Le constructeur a des méthodes pour définir les valeurs:
Suppression des propriétés:
APPENDDELETEBySpecificPath (JSonTextArray JSONTextArray)
Ajout d'éléments de tableau
Suppression des éléments du tableau
Certaines méthodes liées à la modification du tableau JSON par défaut nécessitent une bibliothèque org.json.json (cochez les dépendances facultatives). Cependant, il est possible de passer l'implémentation personnalisée de l'interface qui mappe l'objet de collecte à la valeur du tableau JSON avec "withcollectiontojsonArraystringMapper (com.github.starnowski.posjsonhelper.hibernate6.hibernate6jsonupdatestationbuilder.collectiontojsonarraystringmapper)"
Le type HiberNate6JSonUpDateStatementBuilder est générique. Un deuxième type générique est une valeur personnalisée qui peut être ajoutée au contexte HiberNate6JSonupDateStatementBuilder. Vous trouverez ci-dessous un exemple de code dont le type représente les opérations du tableau (éléments qui doivent être ajoutés et supprimés d'un tableau).
Type de valeur personnalisée:
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 ;
}
}Exemple d'utilisation:
// 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 " ]}" );| Nom de propriété | Description |
|---|---|
| com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist | Nom de la fonction SQL qui vérifie si tous les éléments passés comme le texte [] existent dans la propriété JSON Array. Par défaut, le nom est le jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist | Nom de la fonction SQL qui vérifie le cas échéant, car le texte [] existe dans la propriété JSON Array. Par défaut, le nom est le jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.functions.remove_values_from_json_array | Nom de la fonction SQL qui renvoie le tableau JSONB en supprimant les éléments du tableau JSONB passé comme entrée pour la fonction. Par défaut, le nom est le Remove_Values_From_Json_Array |
| com.github.starnowski.posjsonhelper.core.schema | Nom du schéma de base de données où les fonctions SQL doivent être créées |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_all_array_strings_exist | Nom de la fonction HQL qui invoque la fonction SQL spécifiée par com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist. Par défaut, le nom est le jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_any_array_strings_exist | Nom de la fonction HQL qui invoque la fonction SQL spécifiée par com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist. Par défaut, le nom est le jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.json_function_json_array | Nom de la fonction HQL qui enveloppe l'opérateur du tableau dans PostgreSQL. Par défaut, le nom est le json_function_json_array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.remove_values_from_json_array | Nom de la fonction HQL qui enveloppe la fonction qui renvoie le tableau JSONB en supprimant les éléments du tableau JSONB passé en entrée pour la fonction. Par défaut, le nom est le Remove_Values_From_Json_Array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.sqlldefinitionContextFactory.types | Propriété système qui stocke la liste de com.github.starnowski.posjsonhelper.core.sql.isqlDefinitionContextFactory qui doit être chargée. Au lieu de charger des types qui peuvent être trouvés sur le chemin de classe pour le package "com.github.starnowski.posjsonhelper". Les types sur la liste sont séparés par le caractère de virgule ".". |
| com.github.starnowski.posjsonhelper.hibernate6.functiondescriptorgisterfactory.types | (Utilisé uniquement dans Hibernate 6) Propriété système qui stocke la liste de com.github.starnowski.posjsonhelper.hibernate6.descriptor.functionDescriptorRegisterFactoriesupplier des types qui doivent être chargés. Au lieu de charger des types qui peuvent être trouvés sur le chemin de classe pour le package "com.github.starnowski.posjsonhelper". Les types sur la liste sont séparés par le caractère de virgule ".". |
| com.github.starnowski.posjsonhelper.hibernate6.functiondescriptorgisterfactory.types.exclud | (Utilisé uniquement dans Hibernate 6) Propriété système qui stocke la liste de com.github.starnowski.posjsonhelper.hibernate6.descriptor.functiondescriptorRegisterFactoriesupplier qui doit être exclue du chargement. Si "com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.types" La propriété est également spécifiée alors "com.github.starnowski.posjsonhelper.hibernate6.functiondescriptorRegRegRegRegTorfactory.types.exclud" a une privilège plus élevée. Les types sur la liste sont séparés par le caractère de virgule ".". |
Matrice de compatibilité avec Hibernate 6.
| Posjsonhelper | Hibernate 6 |
|---|---|
| 0.3.0 | 6.4.0.Final |
| 0.2.0 - 0.2.1 | 6.1.5 |
Problème avec le package Hibernate, la version ou les classes, etc.
Si vous faites face à un problème lié à la définition de la méthode manquante ou à type comme par exemple:
java.lang.NoSuchMethodError: 'org.hibernate.query.criteria.JpaExpression
Ensuite, veuillez d'abord vérifier si votre projet dispose d'une bibliothèque Hibernate-Core sur ClassPath. Le Hibernate-Core est une dépendance facultative pour ce projet et vous devez vous assurer qu'elle a été ajoutée dans votre projet. Veuillez consulter le numéro similaire 145. Si votre hibernate-core est sur ClassPath et que le problème existe toujours, veuillez signaler le problème.