J'essaie d'exécuter cette requête sur une base de données 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);

Mais je reçois

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

La fonctionnalité JSON de jOOQs ne fonctionne-t-elle pas avec Oracle ?

1
Simon Martinelli 5 nov. 2020 à 11:24

1 réponse

Meilleure réponse

Ce n'est pas lié à votre utilisation de JSON. La même chose se serait produite si vous aviez tout supprimé et écrit cette requête à la place :

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

Votre requête fonctionnerait dans MySQL, PostgreSQL ou SQL standard, où vous pouvez toujours projeter toutes les colonnes fonctionnellement dépendantes après le regroupement par une colonne de clé primaire. Mais dans Oracle, cela ne fonctionne pas. Donc, vous devez ajouter EMPLOYEE.NAME à votre clause GROUP BY.

Il y a une demande de fonctionnalité pour transformer votre SQL en conséquence, mais jOOQ 3.14 ne le prend pas encore en charge : https:/ /github.com/jOOQ/jOOQ/issues/4725

1
Lukas Eder 5 nov. 2020 à 08:30