Исключение DataAccessException при реализации С РЕКУРСИВНЫМ запросом с использованием SQLITE и jOOQ

#java #sqlite #jooq

Вопрос:

В настоящее время я использую jOOQ 3.13.4 и SQLite для выполнения рекурсивного запроса. Я также ограничен использованием только совместимых с Java 8 версий jOOQ. Моя общая структура таблицы выглядит следующим образом:

 CREATE TABLE group (
    ID                  GUID(32)        UNIQUE NOT NULL PRIMARY KEY,
    ParentID            GUID(32)        group (ID) ON DELETE CASCADE 
);

CREATE TABLE map (
    GroupID          GUID(32)    NOT NULL REFERENCES group(ID) ON DELETE CASCADE,
    Path             TEXT        NOT NULL
);
 

Моя цель состоит в том, чтобы выбрать одно group по своему group.ID и получить список всех map.Path значений, связанных с вложенным groups .

В настоящее время я использую РЕКУРСИВНЫЙ учебник, предоставленный jOOQ, и у меня есть код, очень похожий на тот, который описан в учебнике. Это то {some_value} id , что я могу передать в качестве параметра, чтобы определить group , для чего я хочу, чтобы все было вложено paths .

 Table<?> table = table(select(GROUP.ID.as(field(name("id"), UUID)),
                              GROUP.PARENTID.as(field(name("parentId"), UUID)),
                              MAP.PATH.as(field(name("path"), VARCHAR)))
                        .from(GROUP)
                        .join(MAP)
                        .on(MAP.GROUPID.eq(GROUP.ID))).as("table");                                                                          

Field<UUID> id = table.field(name("id"), UUID);
Field<UUID> parentId = table.field(name("parentId"), UUID);
Field<String> path = table.field(name("path"), VARCHAR);

CommonTableExpression<?> cte = name("tree").fields("id", "path")
                                                   .as(select(id,
                                                              path).from(table)
                                                                   .where(id.eq({some_value}))
                                                                   .union(select(id,
                                                                                 path).from(table)
                                                                                      .join(table(name("tree")))
                                                                                      .on(parentId.eq(field(name("tree",
                                                                                                                 "id"),
                                                                                                            UUID)))));

return ctx.withRecursive(cte)
          .selectFrom(cte)
          .fetch(field(name("tree", "path"), VARCHAR), String.class)

 

Однако при запуске метода, содержащего приведенный выше код, я получаю следующее исключение:

 org.jooq.exception.DataAccessException: SQL [with recursive tree(id, path) as (select * from (select "table".id, "table".path from (select group.ID as id, group.ParentID as parentId, map.Path as path from group join map on map.GroupID = group.ID) as "table" where "table".id = ?) x union select * from (select "table".id, "table".path from (select group.ID as id, group.ParentID as parentId, map.Path as path from group join map on map.GroupID = group.ID) as "table" join tree on "table".parentId = tree.id) x) select tree.id, tree.path from tree]; [SQLITE_ERROR] SQL error or missing database (recursive reference in a subquery: tree)

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (recursive reference in a subquery: tree)
 

Это исключение заставляет меня думать, что вы не можете ссылаться на таблицу «дерево» в объявлении «дерево» для SQLite, но, похоже, это можно сделать в учебнике.
Есть ли предостережение в отношении jOOQ и SQLite WITH RECURSIVE ? Или моя таблица с псевдонимами является источником проблемы?

Комментарии:

1. По-прежнему ли проблема возникает с jOOQ 3.15.2?

2. @LukasEder Я, к сожалению, не могу использовать 3.15.*, потому что я ограничен использованием Java 8. Я обновлю вопрос, чтобы включить эту информацию.

3. jOOQ 3.15 по-прежнему поддерживает Java 8, см. Здесь: jooq.org/download/versions . Вы можете просто быстро воспользоваться бесплатной пробной версией, чтобы подтвердить это.

4. @LukasEder Да, я все еще получаю то же исключение DataAccessException

5. Это отлично работает для меня, используя jOOQ 3.15.2 и SQLite 3.36.0.3 (через драйвер xerial jdbc). На моем конце group таблица указана как "group" — так что у вас все еще может не быть правильной версии jOOQ в вашем пути к классу.