#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 в вашем пути к классу.