【问题标题】:Using Oracle SQL-Function JSON_EXISTS in JPQL在 JPQL 中使用 Oracle SQL 函数 JSON_EXISTS
【发布时间】:2022-11-30 18:46:18
【问题描述】:

在我的 Oracle 数据库表中我的表我有专栏列x使用 JSON-Arrays (VARCHAR2),我想找到值所在的所有条目值X在那个数组里面。

在本机 Oracle-SQL 中,以下查询运行良好: SELECT * FROM mytable t WHERE JSON_EXISTS(columnx, '$?(@ == "valueX")');

在我的 Spring Boot 应用程序中,我用 JPQL 编写查询,所以我必须转换它。

以下查询不成功:

  1. 我发现我必须对特定的 SQL-Oracle 函数使用“FUNCTION()”: @Query(value = "SELECT t FROM mytable t WHERE FUNCTION('JSON_EXISTS',t.columnx, '$?(@ == \"valueX\")')") 这会导致 JPQL-Parsing-Error: "QuerySyntaxException: unexpected AST node: function (JSON_EXISTS)"

  2. 我发现 JPQL 需要一个真正的布尔比较,所以我尝试了这个: @Query(value = "SELECT t FROM mytable t WHERE FUNCTION('JSON_EXISTS',t.columnx, '$?(@ == \"valueX\")') = TRUE") 现在 JPQL-Converter 可以成功地将它解析为本机 SQL,但是我在执行查询时遇到了 Oracle-Error:“ORA-00933:SQL 命令未正确结束。” 这是可以理解的,因为解析后的原生 ... WHERE JSON_EXISTS(columnx, '$?(@ == "valueX")') = 1 也不会运行。

    解决这个问题的正确方法是什么?你有什么主意吗?

【问题讨论】:

    标签: sql spring oracle jpa jpql


    【解决方案1】:

    你必须使用'真的'在单引号内。

    我在下面找到了下面的例子 Oracle website 将 jpql 中的 FUNCTION 特殊运算符用于布尔 SQL 函数

      SELECT a FROM Asset a, Geography geo WHERE 
      geo.id = :id AND a.id IN :id_list AND FUNCTION('ST_INTERSECTS',
      a.geometry, geo.geometry) = 'TRUE'
    

    我刚刚读到“TRUE”特定于空间函数,并且在 oracle sql 中不支持布尔表达式的评估。 你有一个选择。使用函数评估为 1 或 0

            CREATE OR REPLACE FUNCTION JSON_TEST
                return number is
                l_count NUMBER:=0;
                BEGIN
                SELECT count(1) into l_count FROM mytable t WHERE JSON_EXISTS(t.columnx, '$?(@ == "valueX")');
                if l_count > 0
                THEN 
                return 1;
                else
                return 0;
                end if;
                END;
    

    然后调用使用

    @Query(value = "SELECT t FROM mytable t WHERE 
    FUNCTION('JSON_TEST')=1");
    

    【讨论】:

    • 感谢您的回答,但它不起作用。 JPQL 将其解析为:... WHERE JSON_EXISTS(columnx, '$?(@ == "valueX")')='TRUE' ,我再次收到此错误:“ORA-00933:SQL 命令未正确结束。”
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 2014-12-03
    • 2019-02-10
    • 2021-03-23
    • 2011-11-15
    • 2017-12-15
    • 1970-01-01
    • 2019-09-20
    相关资源
    最近更新 更多