如何在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
相关产品推荐
相关产品推荐

