如何配置Hibernate以支持MySQL的JSON_TABLE函数?
Hibernate自定义JSON_TABLE函数及JSON查询优化问题
Hibernate支持注册其内置未提供的函数,比如注册GROUP_CONCAT_DISTINCT的示例如下:
registerFunction("GROUP_CONCAT_DISTINCT", new SQLFunctionTemplate(StringType.INSTANCE, "GROUP_CONCAT(DISTINCT ?1)"));
注册后可通过CriteriaBuilder直接调用:
criteriaBuilder.function("GROUP_CONCAT_DISTINCT", String.class, path);
但我不清楚如何定义JSON_TABLE函数,尤其是不知道该传入什么类型作为第一个参数,需要补全以下代码中的空白:
registerFunction("JSON_TABLE", new SQLFunctionTemplate(???, "JSON_TABLE(?1, ?2 COLUMNS (?3))"));
我查看了org.hibernate.Type的实现类,比如ArrayType、EntityType(抽象类,可能对应OneToManyEntityType或OneToOneType),但不确定哪种类型适合,也不知道该如何正确使用。
我的最终目标是通过Hibernate构建包含JSON_TABLE子查询的语句,以下是我想要复现的简化SQL示例:
SET @q = 'A'; SELECT x.id, JSON_UNQUOTE(JSON_SEARCH(x.properties, 'ALL', 'A', NULL, '$[*].value')), JSON_UNQUOTE(JSON_SEARCH(x.properties, 'ALL', 'B', NULL, '$[*].value')), JSON_UNQUOTE(JSON_SEARCH(x.properties, 'ALL', 'C', NULL, '$[*].value')) FROM JSON_TABLE(' [ { "id": "5", "properties": [ { "key": "abc", "value": "A" }, { "key": "abc", "value": "A" } ] }, { "id": "6", "properties": [ { "key": "abc", "value": "A" }, { "key": "abc", "value": "C" } ] } ]', '$[*]' COLUMNS( id INT PATH '$.id', `key` VARCHAR(100) PATH '$.key', properties JSON PATH '$.properties')) x WHERE EXISTS ( SELECT * FROM JSON_TABLE(REPLACE(REPLACE(CONCAT('[', JSON_SEARCH(x.properties, 'ALL', @q, NULL, '$[*].value'), ']'), '[[', '['), ']]', ']'), '$[*]' COLUMNS ( `path` VARCHAR(100) PATH '$' )) paths WHERE JSON_UNQUOTE(JSON_EXTRACT(x.properties, paths.path)) = @q );
另外,如果有更高效的JSON属性/值搜索方案,欢迎分享。
内容的提问来源于stack exchange,提问作者Josh M.
相关产品推荐
相关产品推荐

