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

如何在Java的Hibernate 5中使用Oracle的JSON_TEXTCONTAINS函数

如何在Hibernate中使用Oracle Text的JSON_TEXTCONTAINS函数?

我在Hibernate中尝试调用Oracle Text的JSON_TEXTCONTAINS函数,无论怎么试都无法成功。

之前我已经掌握了在Hibernate中使用JSON_VALUE函数的方法,代码如下:

Expression<String> expression = 
                builder.function("JSON_VALUE", 
                        String.class, 
                        new HibernateInlineExpressionHelper(builder, "my_json_col"), 
                        new HibernateInlineExpressionHelper(builder, "'$.my_json_att'")
                );

之后可以用Hibernate的基础运算符对返回值做比较:

Predicate predicate = builder.like(expression, value + "%");

但在使用JSON_TEXTCONTAINS时,所有尝试都失败了。我先尝试创建如下表达式:

Expression<Boolean> expression = 
                        builder.function("JSON_TEXTCONTAINS", 
                                Boolean.class, 
                                new HibernateInlineExpressionHelper(builder, "my_json_col"), 
                                new HibernateInlineExpressionHelper(builder, "'$.my_json_att'"), 
                                new HibernateInlineExpressionHelper(builder, "'my_json_val'")
                        );

然后调用isTrue判断:

Predicate predicate = builder.isTrue(expression);

但SQL不支持这种写法,报错信息为ORA-00933: SQL command not properly ended。

我还试过这种写法:

Predicate predicate = new BooleanExpressionPredicate((CriteriaBuilderImpl) builder, expression);

但Hibernate对JSON_TEXTCONTAINS不支持这种方式,报错信息如下:

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: function (JSON_TEXTCONTAINS) near line 1, column 301 [select rootAlias from MyEntity as rootAlias left join rootAlias.entityA as generatedAlias0 left join generatedAlias0.entityB as generatedAlias1 inner join rootAlias.contentType as generatedAlias2 where ( 1=1 ) and ( ( generatedAlias2.ref=:param0 ) and ( ( function('JSON_TEXTCONTAINS', my_json_col, '$.my_json_att1', 'my_json_val1') ) and ( function('JSON_TEXTCONTAINS', my_json_col, '$.my_json_att2', 'my_json_val2') ) and ( function('JSON_TEXTCONTAINS', my_json_col, '$.my_json_att3', 'my_json_val3') ) ) ) order by rootAlias.creationDate desc, rootAlias.id desc]

这些谓词的拼接方式如下:

CriteriaQuery<MyEntity> criteriaQuery = builder.createQuery(MyEntity.class);
criteriaQuery.select(root)
                .where(predicateList.toArray(new Predicate[]{}))
                .orderBy(orderList);

由于存在大量带动态参数的其他谓词,我无法直接使用原生SQL。有人知道怎么在Hibernate中正确使用JSON_TEXTCONTAINS函数吗?

注:HibernateInlineExpressionHelper为自定义的SQL辅助类

内容的提问来源于stack exchange,提问作者Ismaël

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:05:40