Библиотека PosjsonHelper-это проект с открытым исходным кодом, который добавляет поддержку Hibernate запроса для функций PostgreSQL JSON. Библиотека также имеет поддержку функций поиска текста PostgreSQL. Чтобы узнать больше о том, как использовать компоненты текстового поиска, проверьте инструкции для текстового модуля. Библиотека написана на языке программирования Java. Проект для этого момента поддерживает Hibernate с версией 5 и 6. Требуемая версия Java, по крайней мере, версия 8 для поддержки Hibernate 5 и версии 11 для Hibernate 6.
Проект доступен в репозитории Central Maven. Вы можете использовать его, просто добавив его в качестве зависимости в файле дескриптора проекта (pom.xml).
Для Hibernate 5:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate5</ artifactId >
< version >0.4.2</ version >
</ dependency >Для Hibernate 6:
< dependency >
< groupId >com.github.starnowski.posjsonhelper</ groupId >
< artifactId >hibernate6</ artifactId >
< version >0.4.2</ version >
</ dependency >Библиотека PosjsonHelper не имеет переходной зависимости от библиотеки Hibernate. Поэтому, пожалуйста, напомним, что спящая зависимость должна быть добавлена в ваш проект, как ниже:
< dependency >
< groupId >org.hibernate</ groupId >
< artifactId >hibernate-core</ artifactId >
< version >????</ version >
</ dependency >Пожалуйста, проверьте матрицу совместимости Hibernate, чтобы проверить правильную версию.
Реализация по умолчанию для некоторых функций, связанных с операциями JSON, требует Org.json: JSON Library. Тем не менее, есть способы реализовать конкретные интерфейсы, и ниже библиотеки может не потребоваться.
< dependency >
< groupId >org.json</ groupId >
< artifactId >json</ artifactId >
< version >20240303</ version >
</ dependency >Если кто -то захочет создать проект локально из источника, см. Файл appling.md, чтобы проверить, как настроить проект локально.
Важный! Этот раздел действителен только для Hibernate 5. Чтобы иметь возможность использовать библиотеку PosjsonHelper в проекте, должен быть указан правильный диалект Hibernate. Библиотека реализует несколько оберток, которые расширяются, уже существуют диалекты Hibernate для PostgreSQL:
Диалект должен быть установлен в файле конфигурации Hibernate, например:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< hibernate-configuration xmlns = " http://www.hibernate.org/xsd/orm/cfg " >
< session-factory >
< property name = " hibernate.dialect " >com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper</ property >
...или, например, в файле свойств настройки Spring Framework:
...
spring.jpa.properties.hibernate.dialect =com.github.starnowski.posjsonhelper.hibernate5.dialects.PostgreSQL95DialectWrapper
...В случае, если у вас уже есть тип, который расширяет тип диалекта Hibernate, и это требуется для вашего проекта. Вы добавляете корректировку в свой тип, чтобы он использовал компонент PostgreSQLidialeCtenRicher.
import com . github . starnowski . posjsonhelper . hibernate5 . PostgreSQLDialectEnricher ;
import org . hibernate . dialect . PostgreSQL95Dialect ;
public class PostgreSQLDialectWithDifferentSchema extends PostgreSQL95Dialect {
public PostgreSQLDialectWithDifferentSchema () {
PostgreSQLDialectEnricher enricher = new PostgreSQLDialectEnricher ();
enricher . enrich ( this );
}
}Важный! Этот раздел действителен только для Hibernate 6. Чтобы использовать библиотеку PosjsonHelper в проекте, который использует Hibernate 6, должна быть указанная org.hibernate.boot.model.functionContributor. Реализация. Библиотека имеет реализацию этого интерфейса, то есть com.github.starnowski.posjsonhelper.hibernate6.posjsonhelperfunctionContributor.
Для использования этой реализации необходимо создать файл с именем "org.hibernate.boot.model.functionContributor" в рамках "Resources/Meta-Inf/Services".
Альтернативное решение состоит в том, чтобы использовать com.github.starnowski.posjsonhelper.hibernate6.sqmfunctionRegyRegistryEnricher компонент во время запуска приложения. Как в приведенном ниже примере с использованием пружинной структуры.
import com . github . starnowski . posjsonhelper . hibernate6 . SqmFunctionRegistryEnricher ;
import jakarta . persistence . EntityManager ;
import org . hibernate . query . sqm . NodeBuilder ;
import org . springframework . beans . factory . annotation . Autowired ;
import org . springframework . context . ApplicationListener ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . event . ContextRefreshedEvent ;
@ Configuration
public class FunctionDescriptorConfiguration implements
ApplicationListener < ContextRefreshedEvent > {
@ Autowired
private EntityManager entityManager ;
@ Override
public void onApplicationEvent ( ContextRefreshedEvent event ) {
NodeBuilder nodeBuilder = ( NodeBuilder ) entityManager . getCriteriaBuilder ();
SqmFunctionRegistryEnricher sqmFunctionRegistryEnricher = new SqmFunctionRegistryEnricher ();
sqmFunctionRegistryEnricher . enrich ( nodeBuilder . getQueryEngine (). getSqmFunctionRegistry ());
}
}Чтобы использовать библиотеку PosjsonHelper, необходимо создать несколько функций SQL, которые выполняют операторы JSON. Некоторые операторы JSON не могут быть выполнены Hibernate, потому что их нужно избежать. Для конфигурации по умолчанию библиотека требует создания ниже функций.
CREATE OR REPLACE FUNCTION jsonb_all_array_strings_exist (jsonb, text []) RETURNS boolean AS $$
SELECT $ 1 ?& $ 2 ;
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION jsonb_any_array_strings_exist (jsonb, text []) RETURNS boolean AS $$
SELECT $ 1 ?| $ 2 ;
$$ LANGUAGE SQL;Сгенерированный оператор DDL может быть выполнен во время интеграционных тестов или используется инструментами, которые применяют изменения в базе данных, такие как LiquiBase или Flayway. Важный! Если бы было необходимо использовать аналогичную функцию, но с разными именами, это должно быть указано в свойствах приложения. Это требуется, потому что типы расширяют тип диалекта Hibernate, упомянутый в разделе [Как прикрепить диалект PostgreSQL »] (#Как-то-притах Однако, если такие свойства должны быть переданы по -разному, то тип PostgreSqlDialeCtenRicher также имеет метод для передачи объектов контекста (пожалуйста, проверьте основной контекст и контекст спящего
Контекстный класс содержит имена функций, используемых библиотекой. Классы диалекта используют компонент CoreContextPropertiessupplier, который генерирует контекстный объект на основе свойства системы.
Также можно программно добавлять DDL, используя тип DatabaseOperationExeCutorFacade. Ниже приведен пример того, как применить изменения DDL в приложении с контекстом Spring Framework.
import com . github . starnowski . posjsonhelper . core . Context ;
import com . github . starnowski . posjsonhelper . core . DatabaseOperationExecutorFacade ;
import com . github . starnowski . posjsonhelper . core . DatabaseOperationType ;
import org . springframework . beans . factory . annotation . Autowired ;
import org . springframework . context . ApplicationListener ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . event . ContextRefreshedEvent ;
import javax . sql . DataSource ;
@ Configuration
public class SQLFunctionsConfiguration implements
ApplicationListener < ContextRefreshedEvent > {
@ Autowired
private Context context ;
@ Autowired
private DataSource dataSource ;
@ Override
public void onApplicationEvent ( ContextRefreshedEvent contextRefreshedEvent ) {
DatabaseOperationExecutorFacade facade = new DatabaseOperationExecutorFacade ();
try {
facade . execute ( dataSource , context , DatabaseOperationType . LOG_ALL );
facade . execute ( dataSource , context , DatabaseOperationType . CREATE );
facade . execute ( dataSource , context , DatabaseOperationType . VALIDATE );
} catch ( Exception e ) {
throw new RuntimeException ( "Error during initialization of sql functions for jsonb type operations" , e );
}
}
}Есть несколько операций, которые могут быть выполнены объектом DatabaseOperationExeCutorFacade
| Название свойства | Описание |
|---|---|
| СОЗДАВАТЬ | Применяет изменения DDL в базу данных |
| Проверять | Утверждает, были ли применены изменения DDL для базы данных |
| УРОНИТЬ | Отбрасывает изменения DDL в базе данных |
| Log_all | Отображает сценарии DDL для создания, проверки и сброса операций |
Для облегчения объяснения давайте предположим, что у нас есть таблица базы данных с одним столбцом, в котором хранится тип JSONB.
create table item (
id int8 not null ,
jsonb_content jsonb,
primary key (id)
)Для этой таблицы мы можем вставить строку с любым JSON, как в примере ниже:
INSERT INTO item (id, jsonb_content) VALUES ( 1 , ' {"top_element_with_set_of_values":["TAG1","TAG2","TAG11","TAG12","TAG21","TAG22"]} ' );
INSERT INTO item (id, jsonb_content) VALUES ( 2 , ' {"top_element_with_set_of_values":["TAG3"]} ' );
-- item without any properties, just an empty json
INSERT INTO item (id, jsonb_content) VALUES ( 6 , ' {} ' );
-- int values
INSERT INTO item (id, jsonb_content) VALUES ( 7 , ' {"integer_value": 132} ' );
-- double values
INSERT INTO item (id, jsonb_content) VALUES ( 10 , ' {"double_value": 353.01} ' );
INSERT INTO item (id, jsonb_content) VALUES ( 11 , ' {"double_value": -1137.98} ' );
-- enum values
INSERT INTO item (id, jsonb_content) VALUES ( 13 , ' {"enum_value": "SUPER"} ' );
-- string values
INSERT INTO item (id, jsonb_content) VALUES ( 18 , ' {"string_value": "the end of records"} ' );Большинство предикатных компонентов используют объект Hibernate Context. Он содержит в основном имена имен функций Hibernate, используемые в проекте. Классы диалекта и тип FunctionContributor Используйте компонент hibernatecontextpropertiessupplier, который генерирует объект hibernatecontext на основе свойства системы. Если нет необходимости изменять имена функций HQL по умолчанию для операторов PSOJSONHELPER, то это даже использовать HibernateContext, созданный компонентом Builder, как ниже:
HibernateContext hibernateContext = HibernateContext . builder (). build ();«JSONB_EXTRACT_PATH» - это функция PostgreSQL, которая возвращает значение jsonb, указанное элементами пути, передаваемым как «Text []» (эквивалентно #> оператору). Это полезно, потому что многие функции используют тип «jsonb» для выполнения. Пожалуйста, проверьте документацию PostgreSQL для получения дополнительной информации. Hibernate 5 Пример : ниже приведен пример метода, который возвращает список элементов объекта, для которого свойство содержимого JSON «TOP_ELEMENT_WITH_SET_OF_VALUES» содержит точный набор значений. Пример использует jsonballarraystringsexistpredicate.
@ Autowired
private HibernateContext hibernateContext ;
@ Autowired
private EntityManager entityManager ;
public List < Item > findAllByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}Для приведенного выше метода Hibernate выполнит запрос HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_all_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1)) = TRUENative SQL будет иметь ниже формы:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_all_array_strings_exist(jsonb_extract_path( item0_ . jsonb_content ,?), array[?]) = trueДля получения более подробной информации, пожалуйста, проверьте DAO, используемый в тестах.
Hibernate 6 Пример :
Ниже есть тот же пример, что и выше, но для Hibernate 6.
import org . hibernate . query . sqm . NodeBuilder ;
....
@ Autowired
private HibernateContext hibernateContext ;
@ Autowired
private EntityManager entityManager ;
public List < Item > findAllByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( NodeBuilder ) cb , new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}Для получения более подробной информации, пожалуйста, проверьте DAO, используемый в тестах.
«JSONB_EXTRACT_PATH_TEXT» - это функция PostgreSQL, которая возвращает значение JSON как текст, на который указывается элементы пути, передаваемые как «Text []» (эквивалентно оператору #>>. Пожалуйста, проверьте документацию PostgreSQL для получения дополнительной информации. Ниже приведен пример для Hibernate 5 метода, который ищет элементы, содержащие определенные строковые значения, сопоставленные оператором «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 ();
}Для приведенного выше метода Hibernate выполнит запрос HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_extract_path_text( generatedAlias0 . jsonbContent , :param0 ) like :param1Native SQL будет иметь ниже формы:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_extract_path_text( item0_ . jsonb_content ,?) like ?Для получения более подробной информации и примеров с оператором IN или как использовать числовые значения, пожалуйста, проверьте DAO, используемый в тестах.
Hibernate 6 Пример :
Ниже есть тот же пример, что и выше, но для Hibernate 6.
....
public List < Item > findAllByStringValueAndLikeOperator ( String expression ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( cb . like ( new JsonBExtractPathText ( root . get ( "jsonbContent" ), singletonList ( "string_value" ), ( NodeBuilder ) cb ), expression ));
return entityManager . createQuery ( query ). getResultList ();
}Для получения более подробной информации, пожалуйста, проверьте DAO, используемый в тестах.
Тип jsonballarrayStringSexistPredicate представляет предикат, который проверяет, если в свойстве JSON Array существуют проверенные массивы. Первым примером этого предиката был введен в разделе «jsonbextractpath - jsonb_extract_path». Эти предикаты предполагают, что функция SQL с именем по умолчанию JSONB_ALL_ARRAY_STRINGS_EXIST, упомянутая в разделе «Применить изменения DDL». Приведенный ниже пример с комбинацией с оператором не представляет элементы, на которых нет всех поисковых строк. Пример действителен только для Hibernate 5!
public List < Item > findAllThatDoNotMatchByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
Predicate notAllMatchingTags = cb . not ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
Predicate withoutSetOfValuesProperty = cb . isNull ( new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )));
query . where ( cb . or ( withoutSetOfValuesProperty , notAllMatchingTags ));
return entityManager . createQuery ( query ). getResultList ();
}Для приведенного выше метода Hibernate выполнит запрос HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
(
jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) is null
)
or (
jsonb_all_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param1 ) , json_function_json_array(:param2, :param3)) = FALSE
)Native SQL будет иметь ниже формы:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_extract_path( item0_ . jsonb_content ,?) is null
or jsonb_all_array_strings_exist(jsonb_extract_path( item0_ . jsonb_content ,?), array[?,?]) = falseHibernate 6 Пример :
Ниже есть тот же пример, что и выше, но для Hibernate 6.
public List < Item > findAllThatDoNotMatchByAllMatchingTags ( Set < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
Predicate notAllMatchingTags = cb . not ( new JsonbAllArrayStringsExistPredicate ( hibernateContext , ( NodeBuilder ) cb , new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )), tags . toArray ( new String [ 0 ])));
Predicate withoutSetOfValuesProperty = cb . isNull ( new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )));
query . where ( cb . or ( withoutSetOfValuesProperty , notAllMatchingTags ));
return entityManager . createQuery ( query ). getResultList ();
}Для получения более подробной информации, пожалуйста, проверьте DAO, используемый в тестах.
Тип jsonbanyarraystringsexistpredicate представляет собой предикат, который проверяет, если в свойстве JSON Array существуют проверки строковых массивов. Эти предикаты предполагают, что функция SQL с именем по умолчанию JSONB_ANY_ARRAY_STRINGS_EXIST, упомянутая в разделе «Применить изменения DDL». Ниже приведен пример метода, который ищет все элементы, которые содержит массив, содержит хотя бы одну строку, передаваемую из массива, передаваемого в качестве аргумента метода. Пример действителен только для Hibernate 5!
public List < Item > findAllByAnyMatchingTags ( HashSet < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAnyArrayStringsExistPredicate ( hibernateContext , ( CriteriaBuilderImpl ) cb , new JsonBExtractPath (( CriteriaBuilderImpl ) cb , singletonList ( "top_element_with_set_of_values" ), root . get ( "jsonbContent" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}Для приведенного выше метода Hibernate выполнит запрос HQL:
select
generatedAlias0
from
Item as generatedAlias0
where
jsonb_any_array_strings_exist( jsonb_extract_path( generatedAlias0 . jsonbContent , :param0 ) , json_function_json_array(:param1, :param2)) = TRUENative SQL будет иметь ниже формы:
select
item0_ . id as id1_0_,
item0_ . jsonb_content as jsonb_co2_0_
from
item item0_
where
jsonb_any_array_strings_exist(jsonb_extract_path( item0_ . jsonb_content ,?), array[?,?]) = trueHibernate 6 Пример :
Ниже есть тот же пример, что и выше, но для Hibernate 6.
public List < Item > findAllByAnyMatchingTags ( HashSet < String > tags ) {
CriteriaBuilder cb = entityManager . getCriteriaBuilder ();
CriteriaQuery < Item > query = cb . createQuery ( Item . class );
Root < Item > root = query . from ( Item . class );
query . select ( root );
query . where ( new JsonbAnyArrayStringsExistPredicate ( hibernateContext , ( NodeBuilder ) cb , new JsonBExtractPath ( root . get ( "jsonbContent" ), ( NodeBuilder ) cb , singletonList ( "top_element_with_set_of_values" )), tags . toArray ( new String [ 0 ])));
return entityManager . createQuery ( query ). getResultList ();
}Для получения более подробной информации и примеров с оператором IN или как использовать числовые значения, пожалуйста, проверьте DAO, используемый в тестах.
Библиотека также может быть использована для операций модификации JSON. По умолчанию, в Hibernate мы всегда можем обновить столбец с контентом JSON, установив все его значение. Библиотека PosjsonHelper также позволяет изменить контент JSON, настраивая, заменив или удаляя отдельные свойства JSON без замены его полного содержимого. Библиотека содержит несколько функций JSON и операторов, которые позволяют выполнять этот тип работы.
Обертка для функции jsonb_set. Функция устанавливает или заменяет значение свойства JSON на основе пути JSON. Проверьте следующий пример того, как его можно использовать с компонентом CriteriaUpdate:
// GIVEN
Long itemId = 19L ;
String property = "birthday" ;
String value = "1970-01-01" ;
String expectedJson = "{ " child " : { " pets " : [ " dog " ], " birthday " : " 1970-01-01 " }}" ;
// when
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , new JsonbSetFunction (( NodeBuilder ) entityManager . getCriteriaBuilder (), root . get ( "jsonbContent" ), new JsonTextArrayBuilder (). append ( "child" ). append ( property ). build (). toString (), JSONObject . quote ( value ), hibernateContext ));
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), itemId ));
// Execute the update
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// then
Item item = tested . findById ( itemId );
assertThat (( String ) JsonPath . read ( item . getJsonbContent (), "$.child." + property )). isEqualTo ( value );
JSONObject jsonObject = new JSONObject ( expectedJson );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( jsonObject . toString ());Это генерирует следующее оператор обновления SQL:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], ?::jsonb)
where
id = ?
Hibernate:
select
i1_0 . id ,
i1_0 . jsonb_content
from
item i1_0
where
i1_0 . id = ?Функция также может использоваться в операторах HQL, как в следующем примере:
@ Transactional
public void updateJsonBySettingPropertyForItemByHQL ( Long itemId , String property , String value ) {
// Execute the update
String hqlUpdate = "UPDATE Item SET jsonbContent = jsonb_set(jsonbContent, %s(:path, 'text[]'), %s(:json, 'jsonb' ) ) WHERE id = :id" . formatted ( hibernateContext . getCastFunctionOperator (), hibernateContext . getCastFunctionOperator ());
int updatedEntities = entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , itemId )
. setParameter ( "path" , new JsonTextArrayBuilder (). append ( "child" ). append ( property ). build (). toString ())
. setParameter ( "json" , JSONObject . quote ( value ))
. executeUpdate ();
}Обертка для оператора конкатенации. Обертка объединяет два значения JSONB в новое значение JSONB. Проверьте следующий пример того, как его можно использовать с компонентом CriteriaUpdate:
// GIVEN
Long itemId = 19l ;
String property = "birthday" ;
String value = "1970-01-01" ;
// WHEN
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
JSONObject jsonObject = new JSONObject ();
jsonObject . put ( "child" , new JSONObject ());
jsonObject . getJSONObject ( "child" ). put ( property , value );
criteriaUpdate . set ( "jsonbContent" , new ConcatenateJsonbOperator (( NodeBuilder ) entityManager . getCriteriaBuilder (), root . get ( "jsonbContent" ), jsonObject . toString (), hibernateContext ));
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), itemId ));
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
Item item = tested . findById ( itemId );
assertThat (( String ) JsonPath . read ( item . getJsonbContent (), "$.child." + property )). isEqualTo ( value );
JSONObject expectedJsonObject = new JSONObject (). put ( property , value );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$.child" ));
assertThat ( document . jsonString ()). isEqualTo ( expectedJsonObject . toString ());Это генерирует следующее оператор обновления SQL:
update
item
set
jsonb_content = jsonb_content || ?::jsonb
where
id = ?
Hibernate:
select
i1_0 . id ,
i1_0 . jsonb_content
from
item i1_0
where
i1_0 . id = ?Функция также может использоваться в операторах HQL, как в следующем примере:
@ Transactional
public void updateJsonPropertyForItemByHQL ( Long itemId , String property , String value ) throws JSONException {
JSONObject jsonObject = new JSONObject ();
jsonObject . put ( "child" , new JSONObject ());
jsonObject . getJSONObject ( "child" ). put ( property , value );
String hqlUpdate = "UPDATE Item SET jsonbContent = %s(jsonbContent, %s(:json, 'jsonb' ) ) WHERE id = :id" . formatted ( hibernateContext . getConcatenateJsonbOperator (), hibernateContext . getCastFunctionOperator ());
int updatedEntities = entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , itemId )
. setParameter ( "json" , jsonObject . toString ())
. executeUpdate ();
}Обертка для удаления оператора '#-'. Обертка удаляет поле или элемент массива на основе индекса на указанном пути, где элементы пути могут быть либо полевыми клавишами, либо индексами массива. Проверьте следующий пример того, как его можно использовать с компонентом CriteriaUpdate:
// GIVEN
Item item = tested . findById ( 19L );
JSONObject jsonObject = new JSONObject ( "{ " child " : { " pets " : [ " dog " ]}}" );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( jsonObject . toString ());
// WHEN
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , new DeleteJsonbBySpecifiedPathOperator (( NodeBuilder ) entityManager . getCriteriaBuilder (), root . get ( "jsonbContent" ), new JsonTextArrayBuilder (). append ( "child" ). append ( "pets" ). build (). toString (), hibernateContext ));
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 19L ));
// Execute the update
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
jsonObject = new JSONObject ( "{ " child " : {}}" );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( jsonObject . toString ());Это генерирует следующее оператор обновления SQL:
update
item
set
jsonb_content = (jsonb_content # - ?::text[])
where
id = ?Функция также может использоваться в операторах HQL, как в следующем примере:
@ Transactional
public void updateJsonByDeletingSpecificPropertyForItemByHql ( Long itemId , String property ) {
// Execute the update
String hqlUpdate = "UPDATE Item SET jsonbContent = %s(jsonbContent, %s(:path, 'text[]') ) WHERE id = :id" . formatted ( hibernateContext . getDeleteJsonBySpecificPathOperator (), hibernateContext . getCastFunctionOperator ());
int updatedEntities = entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , itemId )
. setParameter ( "path" , new JsonTextArrayBuilder (). append ( "child" ). append ( property ). build (). toString ())
. executeUpdate ();
}Тип removeJsonValuesfromJsonArrayFunction - это оператор Hibernate, который вызывает функцию SQL, сгенерированную библиотекой PosjsonHelper. По умолчанию, сгенерированная функция выглядит как пример ниже:
CREATE OR REPLACE FUNCTION {{schema}}.remove_values_from_json_array(input_json jsonb, values_to_remove jsonb) RETURNS jsonb AS $$
DECLARE
result jsonb;
BEGIN
IF jsonb_typeof(values_to_remove) <> ' array ' THEN
RAISE EXCEPTION ' values_to_remove must be a JSON array ' ;
END IF;
result : = (
SELECT jsonb_agg(element)
FROM jsonb_array_elements(input_json) AS element
WHERE NOT (element IN ( SELECT jsonb_array_elements(values_to_remove)))
);
RETURN COALESCE(result, ' [] ' ::jsonb);
END;
$$ LANGUAGE plpgsql;Функция имеет два входных параметра. Во -первых, это массив JSON, который является базовым массивом для результата, что функция вернется. Второй параметр также представляет собой массив JSON, который представляет элемент, который должен быть удален из массива результатов. Ниже приведен пример кода того, как эта функция может использоваться с другим оператором для обновления столбцов JSON с помощью оператора обновления SQL.
// GIVEN
Item item = tested . findById ( 24L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " mask " , " fins " , " compass " ]}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
NodeBuilder nodeBuilder = ( NodeBuilder ) entityManager . getCriteriaBuilder ();
JSONArray toRemoveJSONArray = new JSONArray ( Arrays . asList ( "mask" , "compass" ));
RemoveJsonValuesFromJsonArrayFunction deleteOperator = new RemoveJsonValuesFromJsonArrayFunction ( nodeBuilder , new JsonBExtractPath ( root . get ( "jsonbContent" ), nodeBuilder , Arrays . asList ( "inventory" )), toRemoveJSONArray . toString (), hibernateContext );
JsonbSetFunction jsonbSetFunction = new JsonbSetFunction ( nodeBuilder , ( SqmTypedNode ) root . get ( "jsonbContent" ), new JsonTextArrayBuilder (). append ( "inventory" ). build (). toString (), deleteOperator , hibernateContext );
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , jsonbSetFunction );
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 24L ));
// WHEN
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " fins " ]}" );Тот же пример, но с примером запроса HQL:
// GIVEN
Item item = tested . findById ( 24L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " mask " , " fins " , " compass " ]}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
JSONArray toRemoveJSONArray = new JSONArray ( Arrays . asList ( "mask" , "compass" ));
String hqlUpdate = "UPDATE Item SET jsonbContent = %s(jsonbContent, %s(:path, 'text[]'), %s(jsonb_extract_path( jsonbContent , 'inventory' ), %s(:to_remove, 'jsonb')) ) WHERE id = :id" . formatted ( JSONB_SET_FUNCTION_NAME , hibernateContext . getCastFunctionOperator (), hibernateContext . getRemoveJsonValuesFromJsonArrayFunction (), hibernateContext . getCastFunctionOperator ());
// WHEN
entityManager . createQuery ( hqlUpdate )
. setParameter ( "id" , 24L )
. setParameter ( "path" , new JsonTextArrayBuilder (). append ( "inventory" ). build (). toString ())
. setParameter ( "to_remove" , toRemoveJSONArray . toString ())
. executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " fins " ]}" );Эти два примера будут генерировать ниже оператора SQL:
update
item
set
jsonb_content = jsonb_set(jsonb_content, ?:: text [], remove_values_from_json_array(jsonb_extract_path(jsonb_content, ?), ?::jsonb))
where
id = ?Использование одной функции JSONB_SET для установки одного свойства для JSON с одним оператором обновления может быть полезным, однако может быть более полезно, чтобы иметь возможность устанавливать несколько свойств на разных уровнях дерева JSON с помощью одного оператора обновления.
Чтобы проверить ниже пример кода:
// GIVEN
Item item = tested . findById ( 23L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " dog " ]}, " inventory " :[ " mask " , " fins " ], " nicknames " :{ " school " : " bambo " , " childhood " : " bob " }}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
Hibernate6JsonUpdateStatementBuilder hibernate6JsonUpdateStatementBuilder = new Hibernate6JsonUpdateStatementBuilder ( root . get ( "jsonbContent" ), ( NodeBuilder ) entityManager . getCriteriaBuilder (), hibernateContext );
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "child" ). append ( "birthday" ). build (), quote ( "2021-11-23" ));
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "child" ). append ( "pets" ). build (), "[ " cat " ]" );
hibernate6JsonUpdateStatementBuilder . appendDeleteBySpecificPath ( new JsonTextArrayBuilder (). append ( "inventory" ). append ( "0" ). build ());
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "parents" ). append ( 0 ). build (), "{ " type " : " mom " , " name " : " simone " }" );
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "parents" ). build (), "[]" );
hibernate6JsonUpdateStatementBuilder . appendDeleteBySpecificPath ( new JsonTextArrayBuilder (). append ( "nicknames" ). append ( "childhood" ). build ());
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , hibernate6JsonUpdateStatementBuilder . build ());
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 23L ));
// WHEN
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " cat " ], " birthday " : " 2021-11-23 " }, " parents " :[{ " name " : " simone " , " type " : " mom " }], " inventory " :[ " fins " ], " nicknames " :{ " school " : " bambo " }}" );В приведенном выше коде мы хотим установить три свойства JSON «Child.birthday», «Child.pets» и «Родители» и удалить двух других, «Inventory.0» и «Прозвище. Собственность «Родители» - это новая собственность, которая, как предполагается, является массивом. Хотя настройка нового свойства массива с некоторыми значениями может быть сделано с помощью одной операции, однако для демонстрационной цели мы используем две операции. Одним из них является установка новой собственности, называемой «родителями» с пустым массивом JSON в качестве значения. И еще одна операция, которая устанавливает элемент массива в определенном индексе. Если более высокого свойства не существует, то его нужно создавать до внутренних свойств. К счастью, экземпляр по умолчанию типа Hibernate6jsonupDateStatementBuilder имеет соответствующие компоненты сортировки и фильтрации, чтобы помочь вам установить правильный порядок операций. Таким образом, не имеет значения, добавляем ли мы операцию с добавлением элемента до или после добавления операции Create-Array. По умолчанию операции, которые удаляют контент, будут добавлены перед теми, которые добавляют или заменяют контент. Конечно, можно отключить такое поведение, установив эти компоненты на NULL. Для получения дополнительной информации, пожалуйста, проверьте Javadoc на наличие типа Hibernate6jsonupDateStatementBuilder.
Этот код генерирует ниже оператора SQL:
update
item
set
jsonb_content =
jsonb_set(
jsonb_set(
jsonb_set(
jsonb_set(
(
(jsonb_content # - ?::text[]) -- the most nested #- operator
# - ?::text[])
, ?:: text [], ?::jsonb) -- the most nested jsonb_set operation
, ?:: text [], ?::jsonb)
, ?:: text [], ?::jsonb)
, ?:: text [], ?::jsonb)
where
id = ?Наиболее внутреннее выполнение функции JSONB_SET для этого подготовленного оператора будет установить пустой массив для свойства «родителей».
Строитель имеет методы для установки значений:
Удаление свойств:
AppendDeleteByspecificPath (jsonTextArray jsonTextArray)
Добавление элементов массива
Удаление элементов массива
Некоторые методы, связанные с модификацией на массиве JSON по умолчанию, требуют библиотеки org.json.json (проверьте необязательные зависимости). Тем не менее, можно передать пользовательскую реализацию интерфейса, которая отображает объект сбора сборов с значением массива JSON с «withCollectionTojsonArrayStringMapper (com.github.starnowski.posjsonhelper.hibernate6.hibernate6jsonupdateStatementBuilder.collectionTojSrayStringMapper)" Builder
Hibernate6jsonupDateStatementBuilder тип является общим. Второй общий тип - это пользовательское значение, которое можно добавить в контекст Hibernate6jsonupDateStateMentBuilder. Ниже приведен пример кода, тип которого представляет операции массива (элементы, которые должны быть добавлены и удалены из массива).
Пользовательский тип значения:
private static class JsonArrayOperations {
private final List < String > toDelete ;
private final List < String > toAdd ;
public JsonArrayOperations ( List < String > toDelete , List < String > toAdd ) {
this . toDelete = toDelete ;
this . toAdd = toAdd ;
}
public List < String > getToDelete () {
return toDelete ;
}
public List < String > getToAdd () {
return toAdd ;
}
}Пример использования:
// GIVEN
Item item = tested . findById ( 24L );
DocumentContext document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " child " :{ " pets " :[ " crab " , " chameleon " ]}, " inventory " :[ " mask " , " fins " , " compass " ]}" );
CriteriaUpdate < Item > criteriaUpdate = entityManager . getCriteriaBuilder (). createCriteriaUpdate ( Item . class );
Root < Item > root = criteriaUpdate . from ( Item . class );
Hibernate6JsonUpdateStatementBuilder < Object , JsonArrayOperations > hibernate6JsonUpdateStatementBuilder = new Hibernate6JsonUpdateStatementBuilder ( root . get ( "jsonbContent" ), ( NodeBuilder ) entityManager . getCriteriaBuilder (), hibernateContext );
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "child" ). append ( "pets" ). build (), null , new JsonArrayOperations ( Arrays . asList ( "crab" , "ant" ), Arrays . asList ( "lion" , "dolphin" )));
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "name" ). build (), JSONObject . quote ( "Simon" ));
hibernate6JsonUpdateStatementBuilder . appendJsonbSet ( new JsonTextArrayBuilder (). append ( "inventory" ). build (), null , new JsonArrayOperations ( Arrays . asList ( "compass" , "mask" ), Arrays . asList ( "knife" )));
hibernate6JsonUpdateStatementBuilder . withJsonbSetFunctionFactory ( new Hibernate6JsonUpdateStatementBuilder . DefaultJsonbSetFunctionFactory < Object , JsonArrayOperations >() {
public JsonbSetFunction build ( NodeBuilder nodeBuilder , Path < Object > rootPath , JsonUpdateStatementConfiguration . JsonUpdateStatementOperation < JsonArrayOperations > operation , HibernateContext hibernateContext ) {
if ( operation . getCustomValue () != null ) {
JSONArray toAddJSONArray = new JSONArray ( operation . getCustomValue (). getToAdd ());
ConcatenateJsonbOperator concatenateOperator = new ConcatenateJsonbOperator ( nodeBuilder , new JsonBExtractPath ( rootPath , nodeBuilder , operation . getJsonTextArray (). getPath (). stream (). map ( ob -> ob . toString ()). collect ( Collectors . toList ())), toAddJSONArray . toString (), hibernateContext );
JSONArray toRemoveJSONArray = new JSONArray ( operation . getCustomValue (). getToDelete ());
RemoveJsonValuesFromJsonArrayFunction deleteOperator = new RemoveJsonValuesFromJsonArrayFunction ( nodeBuilder , concatenateOperator , toRemoveJSONArray . toString (), hibernateContext );
return new JsonbSetFunction ( nodeBuilder , ( SqmTypedNode ) rootPath , operation . getJsonTextArray (). toString (), deleteOperator , hibernateContext );
} else {
return super . build ( nodeBuilder , rootPath , operation , hibernateContext );
}
}
@ Override
public JsonbSetFunction build ( NodeBuilder nodeBuilder , SqmTypedNode sqmTypedNode , JsonUpdateStatementConfiguration . JsonUpdateStatementOperation < JsonArrayOperations > operation , HibernateContext hibernateContext ) {
if ( operation . getCustomValue () != null ) {
JSONArray toAddJSONArray = new JSONArray ( operation . getCustomValue (). getToAdd ());
ConcatenateJsonbOperator concatenateOperator = new ConcatenateJsonbOperator ( nodeBuilder , new JsonBExtractPath ( root . get ( "jsonbContent" ), nodeBuilder , operation . getJsonTextArray (). getPath (). stream (). map ( ob -> ob . toString ()). collect ( Collectors . toList ())), toAddJSONArray . toString (), hibernateContext );
JSONArray toRemoveJSONArray = new JSONArray ( operation . getCustomValue (). getToDelete ());
RemoveJsonValuesFromJsonArrayFunction deleteOperator = new RemoveJsonValuesFromJsonArrayFunction ( nodeBuilder , concatenateOperator , toRemoveJSONArray . toString (), hibernateContext );
return new JsonbSetFunction ( nodeBuilder , sqmTypedNode , operation . getJsonTextArray (). toString (), deleteOperator , hibernateContext );
} else {
return super . build ( nodeBuilder , sqmTypedNode , operation , hibernateContext );
}
}
});
// Set the property you want to update and the new value
criteriaUpdate . set ( "jsonbContent" , hibernate6JsonUpdateStatementBuilder . build ());
// Add any conditions to restrict which entities will be updated
criteriaUpdate . where ( entityManager . getCriteriaBuilder (). equal ( root . get ( "id" ), 24L ));
// WHEN
entityManager . createQuery ( criteriaUpdate ). executeUpdate ();
// THEN
entityManager . refresh ( item );
document = JsonPath . parse (( Object ) JsonPath . read ( item . getJsonbContent (), "$" ));
assertThat ( document . jsonString ()). isEqualTo ( "{ " name " : " Simon " , " child " :{ " pets " :[ " chameleon " , " lion " , " dolphin " ]}, " inventory " :[ " fins " , " knife " ]}" );| Название свойства | Описание |
|---|---|
| com.github.starnowski.posjsonhelper.core.functions.jsonb_all_array_strings_exist | Название функции SQL, которая проверяет, если все передают элементы, поскольку текст [] существует в свойстве массива JSON. По умолчанию имя - JSONB_ALL_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.functions.jsonb_any_array_strings_exist | Имя функции SQL, которая проверяет, если какие -либо передаваемые элементы в качестве текста [] существуют в свойстве массива JSON. По умолчанию имя - JSONB_ANY_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.functions.remove_values_from_json_array | Название функции SQL, которая возвращает массив JSONB, удаляя элементы из массива JSONB, передаваемого в качестве входной функции. По умолчанию имя - remove_values_from_json_array |
| com.github.starnowski.posjsonhelper.core.schema | Имя схемы базы данных, где должны быть созданы функции SQL |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_all_array_strings_exist | Имя функции HQL, которая вызывает функцию SQL, указанную Com.github.starnowski.posjsonHelper.core.functions.jsonb_all_array_strings_exist. По умолчанию имя - JSONB_ALL_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.jsonb_any_array_strings_exist | Имя функции HQL, которая вызывает функцию SQL, указанную Com.github.starnowski.posjsonHelper.core.functions.jsonb_any_array_strings_exist. По умолчанию имя - JSONB_ANY_ARRAY_STRINGS_EXIST |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.json_function_json_array | Имя функции HQL, которая завершает оператор массива в PostgreSQL. По умолчанию имя - json_function_json_array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.remove_values_from_json_array | Имя функции HQL, которая завершает функцию, которая возвращает массив JSONB, удаляя элементы из массива JSONB, передаваемого в качестве входной функции для функции. По умолчанию имя - remove_values_from_json_array |
| com.github.starnowski.posjsonhelper.core.hibernate.functions.sqldefinitionContextFactory.Types | Свойство системы, которое хранит список com.github.starnowski.posjsonhelper.core.sql.isqldefinitionContextFactory, которые следует загружать. Вместо загрузки типов, которые можно найти на классе для пакета "com.github.starnowski.posjsonHelper". Типы в списке разделены символом запятой ». |
| com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.Types | (Используется только в Hibernate 6) Свойство системы, которое хранит список com.github.starnowski.posjsonhelper.hibernate6.descriptor.functionDescriptorRegisterFactoriessupplier, которые должны быть загружены. Вместо загрузки типов, которые можно найти на классе для пакета "com.github.starnowski.posjsonHelper". Типы в списке разделены символом запятой ». |
| com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.types.Excluded | (Используется только в Hibernate 6) Свойство системы, которое хранит список com.github.starnowski.posjsonhelper.hibernate6.descriptor.functionDescriptorRegisterFactoriessUpplier, которые следует исключить из погрузки. Если "com.github.starnowski.posjsonhelper.hibernate6.functionDescriptorRegisterFactory.types" также указывается, затем «com.github.starnowski.posjsonhelper.hibernate6.functDescriptorregisterfactory.types.excluded» имеет более высокий приоритет. Типы в списке разделены символом запятой ». |
Матрица совместимости с Hibernate 6.
| PosjsonHelper | С Wybernate 6 |
|---|---|
| 0,3,0 | 6.4.0.final |
| 0,2,0 - 0,2,1 | 6.1.5.final |
Проблема с пакетом Hibernate, версией или классами и т. Д.
Если вы столкнетесь с проблемой, связанной с отсутствующим определением метода или типом, например:
java.lang.NoSuchMethodError: 'org.hibernate.query.criteria.JpaExpression
Затем сначала проверьте, есть ли в вашем проекте библиотеку Hibernate Core на классе. Hibernate Core является необязательной зависимостью для этого проекта, и вы должны убедиться, что он был добавлен в ваш проект. Пожалуйста, проверьте аналогичный выпуск 145. Если вы сброс Coore находится на Classpath, и проблема все еще существует, пожалуйста, сообщите о выпуске.