You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:34:52