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".