Odczyt tylko niezakończonych seansów

Odczyt tylko niezakończonych seansów
NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 135
0

Chcę wyświetlać userowi filmy z seansami. Oczywiście mają być to niezakończone seanse czyli takie, które mają ustawioną flagę "isFinished" na false. Chciałbym do tego użyć JPA Specification, bo będą jeszcze inne warunki takie jak gatunek filmu, data seansu itp.Niestety nie wiem za bardzo jak to zrobić. Udało mi się napisać taką metodę:

Kopiuj
private static Specification<Film> onlyUnfinishedScreenings() {
        return (root, query, criteriaBuilder) -> {
            return criteriaBuilder.equal(
                    root.join("screenings").get("isFinished"), false
            );
        };
    }

ale z wygenerowanego sqla wynika, że ona tylko filtruje filmy po zakończonych seansach czyli jeśli film ma wszystkie seanse zakończone to taki film w ogolę nie zostanie wyświetlony. Ok, ale to za mało. Mi chodzi o to, że jeśli jakiś film ma np. 2 zakończone seanse i 2 niezakończone, to żeby wyświetlić ten film tylko z tymi 2 niezakończonymi

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
3

A nie możesz po prostu zrobić prostego query, który wyciąga dane na podstawie daty/czasu, zamiast robić jakiś niepotrzebne flagi?

NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 135
0
ledi12 napisał(a):

A nie możesz po prostu zrobić prostego query, który wyciąga dane na podstawie daty/czasu, zamiast robić jakiś niepotrzebne flagi?

A to ma jakieś znaczenie w moim przypadku?

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
2
Nofenak napisał(a):
ledi12 napisał(a):

A nie możesz po prostu zrobić prostego query, który wyciąga dane na podstawie daty/czasu, zamiast robić jakiś niepotrzebne flagi?

A to ma jakieś znaczenie w moim przypadku?

"nie czyńmy bytów ponad konieczną potrzebę"
Jak masz flagę, to musisz ją konseowac itd ... i to konserwować o czasie "pyk, właśnie upłynęła ta sekunda"
Po drugie czyni to seans "bardziej mutowalnym", czyli mniej podatnym na rozproszone bazy / mikroserwisy / cache i inne modne rzeczy

Wizja @ledi12 wg mnie jest słuszna

Seans jest powoływany 2 tyg wcześniej (aby na niego dały się sprzedawać bilety), jest 99.9% szan że sie odbędzie w terminie. MOŻE będzie awaria prądu w dzielnicy, albo wybuchnie kanalizacja piętro wyzej, ale to rzadkie sytuacje, wtedy i tak jest młyn, kasa zwraca za bilety itd...

Można myśleć o kodzie w kasie Seans bool isFinished(), ale dynamicznie podliczający z danych, więc nieprzydatny w JPA

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1
Nofenak napisał(a):
ledi12 napisał(a):

A nie możesz po prostu zrobić prostego query, który wyciąga dane na podstawie daty/czasu, zamiast robić jakiś niepotrzebne flagi?

A to ma jakieś znaczenie w moim przypadku?

Duże, bo tak jak wspominał @AnyKtokolwiek, flagę musisz zmieniać. Można to oddelegować do jakiegoś redisa, czy coś, ale po co aż tak sobie utrudniać? Data na poziomie wyciąganie już jest sama w sobie walidacją.

NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 135
0

Znalazłem rozwiązanie:

Kopiuj
public static Specification<Film> screeningsNotFinished() {
        return (root, query, criteriaBuilder) -> {
            var screeningsJoin = (Join<Object, Object>) root.fetch("screenings");
            return query
                    .where(criteriaBuilder.isFalse(screeningsJoin.get("isFinished")))
                    .distinct(true)
                    .getRestriction();
        };
    }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.