A PosjsonHelper Library é um projeto de código aberto que adiciona suporte à consulta Hibernate para as funções PostgreSQL JSON. A biblioteca também possui suporte para funções de pesquisa de texto PostGresql. Para saber mais sobre como usar os componentes de pesquisa de texto, verifique as instruções do módulo de texto. A biblioteca está escrita em uma linguagem de programação Java. O projeto para este momento suporta o Hibernate com as versão 5 e 6. A versão necessária do Java é pelo menos a versão 8 para o suporte do Hibernate 5 e a versão 11 para o Hibernate 6.
O projeto está disponível no repositório central do Maven. Você pode usá -lo apenas adicionando -o como uma dependência no arquivo do descritor do projeto (pom.xml).
Para Hibernate 5:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate5</ artifactId >
< version >0.4.2</ version >
</ dependency >Para Hibernate 6:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate6</ artifactId >
< version >0.4.2</ version >
</ dependency >A biblioteca PosjsonHelper não possui dependência transitória da biblioteca Hibernate. Portanto, por favor, tenha em mente que a dependência de hibernação deve ser adicionada separadamente em seu projeto, como abaixo:
< dependency >
< groupId >org.hibernate</ groupId >
< artifactId >hibernate-core</ artifactId >
< version >????</ version >
</ dependency >Verifique a matriz da versão de compatibilidade do Hibernate para verificar a versão correta.
A implementação padrão para algumas funcionalidades relacionadas às operações JSON exigem org.json: JSON Library. No entanto, existem maneiras de implementar interfaces específicas e abaixo da biblioteca podem não ser necessárias para adicionar.
< dependency >
< groupId >org.json</ groupId >
< artifactId >json</ artifactId >
< version >20240303</ version >
</ dependency >Se alguém quiser criar o projeto localmente a partir da fonte, consulte o arquivo contribuindo.md para verificar como configurar o projeto localmente.
Importante! Esta seção é válida apenas para o Hibernate 5. Para poder usar a biblioteca Posjsonhelper no projeto, deve ser especificado o dialeto de hibernação correto. A biblioteca implementa poucos invólucros que estendem os dialetos de hibernação já existentes para PostgreSQL:
O dialeto deve ser definido no arquivo de configuração Hibernate, por exemplo:
<? 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 por exemplo, no arquivo de propriedades de configuração da Spring Framework:
...
spring.jpa.properties.hibernate.dialect =com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper
...Caso você já tenha tipo que estenda o tipo de dialeto de hibernato e necessário para o seu projeto. Você adiciona ajuste ao seu tipo para que ele usasse o componente 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 );
}
}Importante! Esta seção é válida apenas para o Hibernate 6. Para usar a biblioteca PosjsonHelper no projeto que usa o Hibernate 6, deve haver uma implementação especificada de org.hibernate.boot.model.functioncontrribuidor. A biblioteca tem implementação desta interface, que é com.github.Starnowski.posjsonnhelper.hibernate6.posjsonSelPerfunctionContribor.
Para usar esta implementação, é necessário criar o arquivo com o nome "org.hibernate.boot.model.functioncontributor" em "Recursos/Meta-Inf/Services".
A solução alternativa é usar o componente com.github.starnowski.posjsonnhelper.hibernate6.sqmfunctionRegistryenricher durante a inicialização do aplicativo. Como no exemplo abaixo, com o uso da estrutura da primavera.
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 ());
}
}Para usar a biblioteca PosjsonHelper, é necessário criar algumas funções SQL que executam os operadores JSON. Alguns operadores JSON não podem ser executados pelo Hibernate porque devem ser escapados. Para uma configuração padrão, a biblioteca exige que as funções abaixo sejam criadas.
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;A instrução DDL gerada pode ser executada durante os testes de integração ou usada por ferramentas que aplicam alterações no banco de dados, como LIFIBASE ou Flyway. Importante! Se haveria exigência de usar função semelhante, mas com nomes diferentes, isso deve ser especificado nas propriedades do aplicativo. É necessário porque os tipos estende o tipo de dialeto de hibernato, mencionado na seção ["Como anexar o dialeto postgreSQL"] (#como o dialeto de instruções-postgresql) pode não ter acesso ao contexto do aplicativo (IOC). No entanto, caso essas propriedades fossem aprovadas de maneira diferente, o tipo PostGresqldialectenRicher também possui um método para passar objetos de contexto (verifique o contexto principal e o contexto de hibernação)
A classe de contexto mantém nomes de funções usadas pela biblioteca. As classes de dialeto usam o componente CoreContextPropertiessupplier que gera objeto de contexto com base na propriedade do sistema.
Também é possível adicionar DDL programaticamente usando o DatabaseOperationExecutorFacade Type. Abaixo, há um exemplo sobre como aplicar alterações no DDL no aplicativo com o contexto da estrutura do Spring.
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 );
}
}
}Existem algumas operações que podem ser executadas pelo objeto DatabaseoperationExecutorFacade
| Nome da propriedade | Descrição |
|---|---|
| CRIAR | Aplica alterações DDL no banco de dados |
| VALIDAR | Valida se as alterações do DDL foram aplicadas ao banco de dados |
| DERRUBAR | Droga as alterações DDL no banco de dados |
| Log_all | Exibe os scripts DDL para operações de criação, validação e soltar |
Para uma explicação mais fácil, vamos supor que temos uma tabela de banco de dados com uma coluna que armazena o tipo JSONB.
create table item (
id int8 not null ,
jsonb_content jsonb,
primary key (id)
)Para esta tabela, podemos inserir a linha com qualquer JSON, como no exemplo abaixo:
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"} ' );A maioria dos componentes predicados usa o objeto de contexto de hibernato. Ele mantém principalmente os nomes dos nomes de funções de hibernação usados no projeto. As classes de dialeto e o tipo de funcionamento da função usam o componente hibernateContextPropertiessuppplier que gera objeto HibernateContext com base na propriedade do sistema. Se não houver necessidade de alterar os nomes de funções HQL padrão para os operadores do Psojsonhelper, é para usar o HibernatEContext criado pelo componente do construtor como abaixo:
HibernateContext hibernateContext = HibernateContext . builder (). build ();A "jsonb_extract_path" é a função PostGresql que retorna o valor JSONB apontado pelos elementos do caminho passados como "texto []" (equivalente ao operador #>). É útil porque muitas funções usam o tipo "jsonb" para execução. Verifique a documentação do PostGresql para obter mais informações. Hibernate 5 Exemplo : abaixo, há um exemplo de um método que retorna uma lista de itens objeto para o qual JSON Content Property "TOP_ELEMENT_WITH_SET_OF_VALUES" contém um conjunto exato de valores. O exemplo use 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 ();
}Para o método acima, o Hibernate executará a consulta HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_all_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1)) = TRUEO SQL nativo terá o formulário abaixo:
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[?]) = truePara mais detalhes, verifique o DAO usado nos testes.
Hibernate 6 Exemplo :
Abaixo, há o mesmo exemplo acima, mas para 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 ();
}Para mais detalhes, verifique o DAO usado nos testes.
O "jsonb_extract_path_text" é a função PostGresql que retorna o valor JSON como texto apontado pelos elementos do caminho passados como "texto []" (equivalente ao operador #>>). Verifique a documentação do PostGresql para obter mais informações. Abaixo, há um exemplo para o Hibernate 5 de um método que procura itens que contêm valores específicos de string correspondidos pelo operador "curtir".
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 ();
}Para o método acima, o Hibernate executará a consulta HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_extract_path_text( generatedAlias0 . jsonbContent , :param0 ) like :param1O SQL nativo terá o formulário abaixo:
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 ?Para obter mais detalhes e exemplos com o operador IN ou como usar valores numéricos, verifique o DAO usado nos testes.
Hibernate 6 Exemplo :
Abaixo, há o mesmo exemplo acima, mas para 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 ();
}Para mais detalhes, verifique o DAO usado nos testes.
O tipo jsonballarraystringSexistPredicate representa predicado que verifica se existirem matrizes de strings passadas na propriedade JSON Array. O primeiro exemplo para este predicado foi introduzido na seção "JSONBEXTRATTHPATH - JSONB_EXTRATT_PATH". Esses predicados assumem que a função SQL com o nome padrão jsonb_all_array_strings_exist, mencionado na seção "Aplicar alterações ddl" existe. O exemplo abaixo com uma combinação com o operador não apresenta itens que não têm todas as seqüências de strings pesquisadas. Exemplo válido apenas para Hibernate 5!
public List < Item > findAllThatDoNotMatchByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
Predicate notAllMatchingTags = cb . not ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
Predicate withoutSetOfValuesProperty = cb . isNull ( new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )));
query . where ( cb . or ( withoutSetOfValuesProperty , notAllMatchingTags ));
return entityManager . createQuery ( query ). getResultList ();
}Para o método acima, o Hibernate executará a consulta 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
)O SQL nativo terá o formulário abaixo:
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 Exemplo :
Abaixo, há o mesmo exemplo acima, mas para 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 ();
}Para mais detalhes, verifique o DAO usado nos testes.
O tipo JsonBanyArrayStringSexistPredicate representa um predicado que verifica se existirem matrizes de string passadas na propriedade JSON Array. Esses predicados assumem que a função SQL com nome padrão JSONB_ANY_ARRAY_STRINGS_EXIST, mencionado na seção "Aplicar alterações DDL" existe. Abaixo, há um exemplo de um método que procura todos os itens que a propriedade que possui a matriz contém pelo menos uma string passada da matriz passada como argumento do método. Exemplo válido apenas para Hibernate 5!
public List < Item > findAllByAnyMatchingTags ( HashSet < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAnyArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}Para o método acima, o Hibernate executará a consulta 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)) = TRUEO SQL nativo terá o formulário abaixo:
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 Exemplo :
Abaixo, há o mesmo exemplo acima, mas para 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 ();
}Para obter mais detalhes e exemplos com o operador IN ou como usar valores numéricos, verifique o DAO usado nos testes.
A biblioteca também pode ser usada para operações de modificação JSON. Por padrão, no Hibernate, sempre podemos atualizar uma coluna com o conteúdo JSON, definindo todo o seu valor. A biblioteca PosjsonHelper também permite modificar o conteúdo JSON, definindo, substituindo ou removendo propriedades JSON individuais sem substituir seu conteúdo completo. A biblioteca contém várias funções e operadores JSON que permitem esse tipo de operação.
Wrapper para função jsonb_set. A função define ou substitui o valor da propriedade JSON com base no caminho JSON. Confira o exemplo a seguir de como ele pode ser usado com o componente Critério Update:
// 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 ());Isso geraria a seguinte declaração de atualização SQL:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], ?::jsonb)
where
id = ?
Hibernate:
select
i1_0 . id ,
i1_0 . jsonb_content
from
item i1_0
where
i1_0 . id = ?A função também pode ser usada em declarações HQL, como no exemplo a seguir:
@ 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 ();
}Invólucro para operador de concatenação. O wrapper concatenando dois valores JSONB em um novo valor JSONB. Confira o exemplo a seguir de como ele pode ser usado com o componente Critério Update:
// 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 ());Isso geraria a seguinte declaração de atualização SQL:
update
item
set
jsonb_content = jsonb_content || ?::jsonb
where
id = ?
Hibernate:
select
i1_0 . id ,
i1_0 . jsonb_content
from
item i1_0
where
i1_0 . id = ?A função também pode ser usada em declarações HQL, como no exemplo a seguir:
@ 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 para excluir o operador '#-'. O invólucro exclui o elemento de campo ou matriz com base no índice no caminho especificado, onde os elementos do caminho podem ser chaves de campo ou índices de matriz. Confira o exemplo a seguir de como ele pode ser usado com o componente Critério Update:
// 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 ());Isso geraria a seguinte declaração de atualização SQL:
update
item
set
jsonb_content = (jsonb_content # - ?::text[])
where
id = ?A função também pode ser usada em declarações HQL, como no exemplo a seguir:
@ 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 ();
}O tipo RemonejsonValuesFromjsonArrayFunction é um operador de hibernato que chama a função SQL gerada pela biblioteca PosjsonHelper. Por padrão, a função gerada se parece com o exemplo abaixo:
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;A função possui dois parâmetros de entrada. Primeiro é o JSON Array, que é uma matriz básica para o resultado de que a função retornará. O segundo parâmetro também é uma matriz JSON que representa um elemento que deve ser removido da matriz de resultados. Abaixo está um exemplo de código de como essa função pode ser usada com outro operador para atualizar as colunas JSON com a instrução 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 " ]}" );O mesmo exemplo, mas com o exemplo de consulta 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 " ]}" );Esses dois exemplos vão gerar abaixo da instrução SQL:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], remove_values_from_json_array(jsonb_extract_path(jsonb_content, ?), ?::jsonb))
where
id = ?Usando uma única função JSONB_SET para definir uma única propriedade para JSON com uma única instrução de atualização pode ser útil, no entanto, pode ser mais útil poder definir várias propriedades em diferentes níveis da árvore json com uma única instrução de atualização.
Não cheque o exemplo abaixo do código:
// 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 " }}" );No código acima, queremos definir três propriedades JSON "Child.Birthday", "Child.Pets" e "Pais" e excluir outros dois "Inventário.0 e" apelidos.Childhood ". A propriedade "Pais" é uma nova propriedade que supõe ser uma matriz. Embora a definição de novas propriedades da matriz com alguns valores possa ser feita com operação única, no entanto, para fins de demonstração, usamos duas operações. Um é para definir uma nova propriedade chamada "Pais" com a matriz JSON vazia como valor. E outra operação que definiu o elemento de uma matriz em índice específico. Se a propriedade superior não existir, ela deve ser criada antes das propriedades internas. Felizmente, a instância padrão do tipo Hibernate6JSONUPDATESTATEMENTBUILLER possui componentes de classificação e filtragem de classificação adequados para ajudá -lo a definir a ordem de operações certa. Portanto, não importa se adicionamos a operação de elemento de acumulação antes ou depois de adicionar a operação de criação de criação. Por padrão, operações que excluem conteúdo serão adicionadas antes daquelas que adicionam ou substituem o conteúdo. Obviamente, é possível desativar esse comportamento definindo esses componentes como nulos. Para mais detalhes, consulte o Javadoc para Hibernate6JSONUPDATESTATEMENTBUILLER TIPO.
Este código gera abaixo da instrução 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 = ?A execução da função JSONB_SET mais interna para esta declaração preparada definirá uma matriz vazia para a propriedade "Pais".
O construtor possui métodos para definir valores:
Remoção de propriedades:
AppendDeleteBysPecificPath (JSontextArray JSontextArray)
Adicionando elementos de matriz
removendo elementos da matriz
Alguns métodos relacionados à modificação no JSON Array por padrão requer org.json.json biblioteca (verifique as dependências opcionais). No entanto, é possível passar a implementação personalizada da interface que mapeia o objeto de coleta do JSON Array Value com "WithcollectionTojsonArrayStringmapper (com.github.Starnowski.posjsonnhelper.hibernate6.hibernate6jsonupdatestatementbuilder.CollectionToJsonArrayStingMaptaPlapper)" BUSTOREIR
O tipo Hibernate6jsonUpDatestatementBuilder é genérico. Um segundo tipo genérico é um valor personalizado que pode ser adicionado ao contexto Hibernate6JSONUPDATESTATEMENTBUILLER. Abaixo está um exemplo de código cujo tipo representa operações de matriz (elementos que devem ser adicionados e removidos de uma matriz).
Tipo de valor personalizado:
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 ;
}
}Exemplo de uso:
// 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 " ]}" );| Nome da propriedade | Descrição |
|---|---|
| com.github.starnowski.posjsonnhelper.core.functions.jsonb_all_array_strings_exist | Nome da função SQL que verifica se todos os elementos passados como o texto [] existem na propriedade JSON Array. Por padrão, o nome é o jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonnhelper.core.functions.jsonb_any_array_strings_exist | Nome da função SQL que verifica se algum elementos passados como o texto [] existe na propriedade JSON Array. Por padrão, o nome é o jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonnhelper.core.functions.remove_values_from_json_array | Nome da função SQL que retorna a matriz JSONB excluindo elementos da matriz JSONB, passados como entrada para função. Por padrão, o nome é o Remone_values_from_json_array |
| com.github.STARNOWSKI.POSJSONHELPER.CORE.SCHEMA | Nome do esquema de banco de dados, onde as funções SQL devem ser criadas |
| com.github.starnowski.posjsonnhelper.core.hibernate.functions.jsonb_all_array_strings_exist | Nome da função HQL que chama a função SQL especificada pelo com.github.Starnowski.posjsonnhelper.core.functions.jsonb_all_array_strings_exist Propriedade. Por padrão, o nome é o jsonb_all_array_strings_exist |
| com.github.starnowski.posjsonnhelper.core.hibernate.functions.jsonb_any_array_strings_exist | Nome da função HQL que chama a função SQL especificada pelo com.github.starnowski.posjsonnhelper.core.functions.jsonb_any_array_strings_exist Propriedade. Por padrão, o nome é o jsonb_any_array_strings_exist |
| com.github.starnowski.posjsonnhelper.core.hibernate.functions.json_function_json_array | Nome da função HQL que envolve o operador da matriz no PostgreSQL. Por padrão, o nome é o json_function_json_array |
| com.github.Starnowski.posjsonnhelper.core.hibernate.functions.remove_values_from_json_array | Nome da função HQL que envolve a função que retorna a matriz JSONB excluindo elementos da matriz JSONB, passados como entrada para função. Por padrão, o nome é o Remone_values_from_json_array |
| com.github.Starnowski.posjsonnhelper.core.hibernate.functions.sqldEfinitionContextFactory.types | Propriedade do sistema que armazena a lista de com.github.starnowski.posjsonnhelper.core.sql.isqlDefinitionContextFactory Tipos que devem ser carregados. Em vez de carregar tipos que podem ser encontrados no pacote de classe para o pacote "com.github.Starnowski.posjsonnhelper". Os tipos na lista são separados pelo caráter de vírgula ".". |
| com.github.Starnowski.posjsonnhelper.hibernate6.functionDescriptorRegisterFactory.Types | (Usado apenas no Hibernate 6) Propriedade do sistema que armazena a lista de com.github.starnowski.posjsonnhelper.hibernate6.descriptor.functionDescriptorRegisterFactoriessupplier Tipos que devem ser carregados. Em vez de carregar tipos que podem ser encontrados no pacote de classe para o pacote "com.github.Starnowski.posjsonnhelper". Os tipos na lista são separados pelo caráter de vírgula ".". |
| com.github.Starnowski.posjsonnhelper.hibernate6.functionDescriptorRegisterFactory.types.excluded | (Usado apenas em Hibernate 6) Propriedade do sistema que armazena a lista de com.github.starnowski.posjsonnhelper.hibernate6.descriptor.functionDescriptorRegisterFactoriessOpplier Tipos que devem ser excluídos da carga. Se "com.github.Starnowski.posjsonnhelper.hibernate6.functionDescriptRorGisterFactory.Types" Propriedade também for especificada "com.github.Starnowski.PosjSonhelper.Ibrinate6.FunctionDescripTorReGisterFactory.TyPes.excluded" Hellainity6. Hander6. Os tipos na lista são separados pelo caráter de vírgula ".". |
Matriz de compatibilidade com hibernato 6.
| Posjsonhelper | Hibernate 6 |
|---|---|
| 0.3.0 | 6.4.0.Final |
| 0.2.0 - 0.2.1 | 6.1.5.Final |
Problema com pacote, versão ou classes de hibernato etc.
Se você enfrentar problemas relacionados à falta de definição ou tipo de método, como por exemplo:
java.lang.NoSuchMethodError: 'org.hibernate.query.criteria.JpaExpression
Em seguida, primeiro verifique se o seu projeto possui biblioteca de núcleo de hibernato no ClassPath. O Hibernate-Core é dependência opcional para este projeto e você deve garantir que ele tenha sido adicionado ao seu projeto. Por favor, verifique a edição 145 semelhante. Se você hiberna-core estiver no ClassPath e o problema ainda existe, relate o problema.