Pagowanie stron w dwóch zapytaniach

0

Cześć
Potrzebuję zrobić JSONa, który zwróci mi z bazy danych wykaz folderów oraz obiektów typu .jpg i .mp3. Foldery mają być tak jak w menadżerach plików, czyli zawsze pierwsze, dopiero potem obiekty. Po jednych i drugich można sortować, np. do dacie, ale znowu - najpierw foldery, potem obiekty. Po stronie backendu mam też obsłużyć paginację strony.
Zrobiłem dwa zapytania SQL - jedno, aby pobierał mi tylko i wyłącznie foldery, drugie dla obiektów. W obu wrzucam obiekt Pageable. I tu pojawia się problem - nie wiem zbytnio jak obsłużyć zapytanie gdy liczba folderów na stronie będzie mniejsza dany rozmiar elementów i muszę pobrać obiekty. Zrobiłem tak jak poniżej i średnio to działa - dla pierwszej strony gdzie są i foldery i obiekty to działa, ale pomiędzy pierwszą a drugą stroną z obiektami "zjada" mi parę wyników. Czy ktoś ma może pomysł jak rozwiązać ten problem? Kod:

public List<File> getFolderAndObject(String sort, Long start, Long maxElement){
        List<File> objectsMedia= null;
        List<File> folders= null;

        Pageable pageable = null;
        Long countFolders = filesRepository.countFolders();
        int sumFolders = 0;
        double remainder = (countFolders / Double.valueOf(maxElement));

        if (start < remainder) {
            pageable = PageRequest.of(start, maxElement, Sort.by(sort));
            folders = filesRepository.getFolders();
            sumFolders = folders.size();
        }
        if (start + 1 - remainder > 0) {
            int page= (int) Math.floor(remainder);
            pageable = PageRequest.of((start - page), (maxElement-sumFolders), Sort.by(sort));
            objectsMedia= filesRepository.getMedia(fillMediaType()); //w fillMediaType jest tworzona Lista z typami, które mają zostać pobrane
        }
        List<File> results = new Arraylist();
        results.add(folders);
        results.add(objectsMedia);
        return results;
}
2

Dlaczego nie możesz tego zrobić jednym zapytaniem? Sklejanie w Javie i nawalanie zapytaniami jest średnie, jeśli da się to zrobić prosto, gładko i bez hackowania w zapytaniu.

Zauważ, że skoro w Twoich założeniach folder ma zawsze pierwszeństwo przed obiektem, niezależnie od "właściwego" kryterium sortowania - to tak naprawdę możesz załatwić sprawę sortując po "typie" obiektu oraz po pożądanym kryterium. Jeśli sortowanie po typie dostanie pierwszeństwo (czyli po nie wiem, jakiejś fladze isFolder czy co to tam masz w schemie), to najpierw wyniki będą sortowane wg. kryterium czy są folderem czy obiektem, a następnie w obrębie "równorzędnych" wg. tego kryterium zostaną posortowane - osobno foldery i osobno obiekty. A potem paginacja będzie już banalna.

0

@superdurszlak: Dzięki za odpowiedź. Też myślałem, aby zrobić to w jednym zapytaniu, bo było by prościej. Tylko problem jest z sortowaniem. To czy obiekt jest folderem czy obiektem multimedialnym jest ustawione w kolumnie "Type" (np. type="Audio,Image,Folder,Video). Więc jak posortuje po typie ("order by type") to pierwszy będę miał Audio (albo w desc Video), więc tutaj też nie wiem jak to zbytnio zrobić.

1

Nie do końca wiem jaki jest Twój use case i czy naprawdę folder musi być takim samym "typem pliku" jak obraz, video czy dźwięk, ale jak dla mnie chcąc mieć wyraźne rozróżnienie między katalogami a nie-katalogami po prostu bym je wprowadził.

0

Wrzuć jakiś przykład - co jest w tabelkach, co ma być na guju. Na 90% jest to do zrobienia jednym zapytaniem

1 użytkowników online, w tym zalogowanych: 0, gości: 1