【问题标题】:jOOQ JSON query results in ORA-00979jOOQ JSON 查询结果为 ORA-00979
【发布时间】:2021-02-17 22:38:02
【问题描述】:

我正在尝试对 Oracle 19c 数据库执行此查询:

Field<JSON> employee = DSL.field("employee", JSON.class);

Table<Record1<JSON>> employees = dsl
            .select(jsonObject(jsonEntry("id", EMPLOYEE.ID), jsonEntry("name", EMPLOYEE.NAME), jsonEntry("phones",
                    jsonArrayAgg(
                            jsonObject(jsonEntry("number", PHONE.PHONENUMBER), jsonEntry("type", PHONE.TYPE)))
            )).as(employee))
            .from(EMPLOYEE)
            .join(PHONE).on(PHONE.EMPLOYEE_ID.eq(EMPLOYEE.ID))
            .groupBy(EMPLOYEE.ID)
            .asTable();

String json = dsl
            .select(jsonArrayAgg(employees.field(employee)))
            .from(employees)
            .fetchOneInto(String.class);

但我明白了

org.springframework.jdbc.BadSqlGrammarException: jOOQ; bad SQL grammar 
    [select json_arrayagg("alias_113372058".employee) from 
        (select json_object(key ? value "EMPLOYEE"."ID", key ? value "EMPLOYEE"."NAME", key ? value json_arrayagg(json_object(key ? value "PHONE"."PHONENUMBER", key ? value "PHONE"."TYPE"))) employee from "EMPLOYEE" join "PHONE" on "PHONE"."EMPLOYEE_ID" = "EMPLOYEE"."ID" group by "EMPLOYEE"."ID") "alias_113372058"]; 
nested exception is java.sql.SQLSyntaxErrorException: ORA-00979: Kein GROUP BY-Ausdruck

jOOQs JSON 功能是否不适用于 Oracle?

【问题讨论】:

    标签: java jooq


    【解决方案1】:

    这与您的 JSON 使用无关。如果您将其全部删除并改为编写此查询,则会发生同样的事情:

    dsl.select(EMPLOYEE.ID, EMPLOYEE.NAME)
       .from(EMPLOYEE)
       .join(PHONE).on(PHONE.EMPLOYEE_ID.eq(EMPLOYEE.ID))
       .groupBy(EMPLOYEE.ID);
    

    您的查询可以在 MySQL、PostgreSQL 或标准 SQL 中运行,您仍然可以在按主键列分组后投影所有功能相关的列。但在 Oracle 中,这不起作用。因此,您必须将EMPLOYEE.NAME 添加到您的GROUP BY 子句中。

    有一个功能请求来相应地转换您的 SQL,但 jOOQ 3.14 尚不支持此功能:https://github.com/jOOQ/jOOQ/issues/4725

    请注意,JSON_ARRAYAGG() 将空集聚合到 NULL,而不是空集 []If that's a problem, use COALESCE()

    【讨论】:

    • 哦,对了。愚蠢的我!我正在将测试从 PostgreSQL 迁移到 Oracle :-) 谢谢!
    猜你喜欢
    • 2016-08-25
    • 2021-06-08
    • 2014-03-24
    • 2014-09-23
    • 1970-01-01
    • 2016-04-30
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多