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

