#java #sql #postgresql #jooq
Вопрос:
У меня есть следующая структура базы данных:
Файл
- идентификатор файла
- имя файла
- идентификатор папки
Папка
- идентификатор папки
- имя папки
- родительская папка_id
Я пытаюсь динамично построить путь к файлу таким образом:
Запрос: — Это возвращает файл и папку, в которой он находится.
dsl.select()
.from( FILE)
.join( FOLDER)
.on( FILE.FOLDER_ID.eq( FOLDER.FOLDER_ID) )
.fetch();
А затем я получаю родительские папки в простой Java:
List<Folder> parentFolders= new ArrayList<>();
Long parentFolderId = record.get( FOLDER.PARENT_FOLDER_ID );
while ( parentFolderId != null )
{
Folder parentFolder = folderService.get(parentFolderId );
parentFolders.add( 0, parentFolder );
parentFolderId = parentFolder.getParentFolderId();
}
Вывод будет выглядеть, например, так:
Folder -> Folder -> Folder -> File
Чтобы, возможно, быть приглашенным в такой класс, как этот:
Long fileId;
String fileName;
Long fileId;
String fileName;
List<Folder> parents;
Есть ли какой-нибудь способ сделать эти два шага в JOOQ? Идея состоит в том, чтобы написать запрос, который также выполняет поиск родительских папок. Возможно ли это вообще только с ДЖУКОМ?
Комментарии:
1. 1) Вы пробовали использовать
WITH RECURSIVE
? С чем вы боролись? 2) Вам нуженList<Folder> parents
список, в котором с нетерпением перечислены все родители, илиFolder parent
достаточно простой ссылки? (Вы все еще можете добавить вспомогательный метод, который собирает список…)2. Я думаю, что родительской папки было бы достаточно. Я пробовал использовать РЕКУРСИВНЫЙ метод, но я должен был использовать подход «сверху вниз» вместо «снизу вверх», потому что я хочу возвращать только папки, содержащие файлы. Я использовал пример, на который вы указали, но проблема, на которую я ссылался, заключалась в том, что я был сверху снизу.