• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spring Data - pobieranie encji z polami według pewnych warunków

42 Warsaw Coding Academy
0 głosów
170 wizyt
pytanie zadane 12 maja 2017 w Java przez Jonki Dyskutant (8,180 p.)
edycja 12 maja 2017 przez Jonki

Używam w programie Spring Data i crudowe repozytorium. 

Mam encję user

@Entity
@Table(name = "users")
public class User {
...
@OneToMany(mappedBy = "recipientUser", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Message> receivedMessages;
...

i encję wiadomość

@Entity
@Table(name = "messages")
public class Message {
...
@ManyToOne
    @JoinColumn(name = "recipient")
    private User recipientUser;
...

Pobieram sobie użytkownika bez problemu

 public User getUser(final Long id);

Jednak teraz chciałbym dodać do swojego serwisu możliwość usuwania wiadomości. Zastanawiałem się chwilę jak to zrobić i wpadłem na pomysł, aby stworzyć w encji "Message" jeszcze jedno pole o nazwie "isVisibleForRecipient" z typem boolean i jeśli użytkowwik usunie odebraną wiadomość to dla niego ona nie będzie już widoczna, ale dla osoby wysyłającej będzie dalej widoczna. Chodzi o to, że posiadam w bazie tylko jedną taką wiadomość i nie mogę jej od tak sobie usunąć, dlatego muszę posługiwać się dodatkowymi polami. Jakbym ją całkowicie usunął, to usunąłbym ją także z bazy, przez co nawet osoba wysyłająca nie widziałaby tej wiadomości. Dlatego jeśli osoba odbierająca wiadomość usunie ją, to tylko zmieni wartość pola widoczności, tak samo jeśli osoba wysyłająca usunie ją z wiadomości wysłanych.

I tu pojawia się problem podczas pobierania encji. Jeśli pobiorę encję w taki sposób jaki robię to teraz, to pobierze mi wszystkie odebrane wiadomości, nawet te które nie są widoczne dla odbiorcy, bo w polu "recipientID" musi być id użytkownika. 

Czy istnieją jakieś adnotację, które modyfikują polecenie pobierania encji w taki sposób, że gdy "isVisibleForRecipient" ma wartość "true" to ta wiadomość nie jest pobierana?

 

EDIT: Znalazłem coś na temat 

NamedNativeQuery

jednak nie wiem w jaki sposób stworzyć w jednym poleceniu warunek, pobrać wartość według warunku i pobrać wiele innych danych jednocześnie w jednym poleceniu. I w jaki sposób pobrać zależne wiadomości na  zasadzie "OneToMany".

1 odpowiedź

0 głosów
odpowiedź 12 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Możesz napisać zapytanie sql które bedzie pobierało tylko te wiadomości które mają nie ustawioną flage.

Tzn możesz mieć repozytorium w którym możesz mieć dwie metody pobierz wiadomości nadawcy i pobierz wiadomości odbiorcy. Które bedą pobierały id użytkownika i bedziesz mógł odfiltrować te które potrzebujesz.

Podobne pytania

0 głosów
0 odpowiedzi 232 wizyt
0 głosów
0 odpowiedzi 143 wizyt
pytanie zadane 17 czerwca 2017 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
0 odpowiedzi 2,079 wizyt
pytanie zadane 22 maja 2017 w Java przez Jonki Dyskutant (8,180 p.)

93,382 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,739 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...