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

如何在Java Criteria API(JPA、Hibernate)中用逗号实现Lateral连接

解决方案

要生成逗号分隔的LATERAL连接(即隐式交叉连接形式),而非显式的JOIN LATERAL,你需要直接将jsonb_array_elements的LATERAL表达式添加到FROM子句中,不用joinLateral方法。以下是基于Hibernate SQM API的实现方式:

代码示例

// 从CriteriaQuery中获取Hibernate的SqmQuery对象
SqmQuery<?> sqmQuery = criteriaQuery.unwrap(SqmQuery.class);

// 获取Table1的根对象
SqmRoot<Table1> table1Root = sqmQuery.getRoot(Table1.class);

// 构建jsonb_array_elements函数调用表达式
SqmExpression<Object> subRatingElements = sqmQuery.getCriteriaBuilder()
        .function(
                "jsonb_array_elements", 
                Object.class,
                // 访问secret_data->'rating'->'subRating'路径
                table1Root.get("secretData")
                        .get("rating")
                        .get("subRating")
        );

// 创建LATERAL派生连接,并指定别名
SqmDerivedJoin<Object> lateralSubRatings = new SqmDerivedJoin<>(
        table1Root,
        subRatingElements,
        JoinType.CROSS,
        "subRatings",
        sqmQuery.getNodeBuilder()
);

// 将LATERAL连接添加到FROM子句
sqmQuery.addFrom(lateralSubRatings);

说明

  • 上述代码通过Hibernate的SQM(Semantic Query Model)API直接操作查询结构,将jsonb_array_elements的调用作为LATERAL源添加到FROM子句,最终生成的SQL会采用逗号分隔的形式:
    FROM table1 t1,
      LATERAL jsonb_array_elements(secret_data->'rating'->'subRating') AS subRatings
    
  • 之前使用joinLateral生成JOIN LATERAL是因为该方法默认生成显式的JOIN语法,对应SQL中的CROSS JOIN LATERAL(或其他JOIN类型),而非隐式的逗号分隔形式。

内容的提问来源于stack exchange,提问作者Amber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:47:40