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

0

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

0

Jeżeli używasz spring data to możesz po prostu w interfejsie zdefiniować metodę getVisibleForRecipient(boolean) i spring wygeneruje odpowiedniego SQLa. Native Query to mechanizm pozwalający na dostęp do niskopoziomowego SQL. Jak już chcesz się bawić z zapytaniami to użyj NamedQuery.

0

Gdy dodaję w interfejsie

@Repository
@Transactional
public interface MessageCRUDRepository extends JpaRepository<Message, Long> {
...
    public boolean getVisibleForRecipient(boolean isVisibleForRecipient);
}

to wywala mi

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property getVisibleForRecipient found for type Message!

W encji mam pole

isVisibleForRecipient

więc raczej nie może być problemu z nazwą metody.

0
 public boolean getVisibleForRecipient

Wyciągasz **Message **a zwracasz boolean?

0
public Message getIsVisibleForRecipient(boolean isVisibleForRecipient);

ale dalej ten sam wyjątek.

0

a ja polecam jooq'a, na poczatku o niebo lepiej bo bedziesz ciagle pisal sqlki, wiecej wejdzie do glowy.

1

Oczywiście że istnieje coś takiego:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
findByVisibleForRecipientTrue bądź False, spróbuj czy zatrybi

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