JOOQ — Рекурсивный запрос

#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. Я думаю, что родительской папки было бы достаточно. Я пробовал использовать РЕКУРСИВНЫЙ метод, но я должен был использовать подход «сверху вниз» вместо «снизу вверх», потому что я хочу возвращать только папки, содержащие файлы. Я использовал пример, на который вы указали, но проблема, на которую я ссылался, заключалась в том, что я был сверху снизу.