Jak dodać warunek do zapytania w Oracle SQL?

0

Hej
Mam takie zapytanie w SQL, baza danych Oracle:

@Query("""
    SELECT p FROM Product p
    WHERE 
      p.type = :type
      AND p.status = :status
""")
List<Product> findProducts(@Param("type") String type, @Param("status") String status);

Chciałbym rozszerzyć szukanie produktów, user będzie mógł podać dwa parametry - onlyRegistered typu boolean i ownerId - typu String
W bazie danych jest pole OWNER_ID typu string, które zawiera id firmy, który wytwarza produkt, bądź gdy jest nullem - oznacza że produkt jest firmy niezarejestrowanej u nas w bazie.

@Query("""
    SELECT p FROM Products p
    WHERE 
      p.type = :type
      AND p.status := :status
      /* tu jakiś CASE */
""")
List<Product> findProducts(@Param("type") String type, @Param("status") String status,
                           @Param("onlyRegistered") boolean onlyRegistered, @Param("ownerId") String ownerId);

Jeśli user poda:

  1. onlyRegistered równe true i ownerId równe NULL, to wtedy zapytanie powinno wyciągać wszystko co ma OWNER_ID IS NOT NULL
  2. onlyRegistered równe true i ownerId z jakąś wartością, to wtedy zapytanie powinno wyciągać wszystko co ma OWNER_ID = wartość
  3. onlyRegistered równe false, ownerId jest wtedy bez znaczenia, zapytanie powinno wyciągać wszystko co ma OWNER_ID IS NULL

Nie wiem jak do końca zrobić to zapytanie, proszę o pomoc:
Wydaje mi się, że trzeba zrobić coś w tym stylu -> https://stackoverflow.com/questions/15396217/if-statement-within-where-clause
Ale nie wiem jak to obsłużyć dla NULLI i true/false, zrobiłem tylko dla trywialnych Stringów :/

0

W powyższym przypadku poszedłbym w Specification / CriteriaBuilder. https://reflectoring.io/spring-data-specifications/

edycja:
A jeśli masz tylko 3 przypadki, to co stoi na przeszkodzie, żeby mieć jest nazwane jako osobne findXZY i wołać odpowiedni wariant per przypadek użycia?
Inna sprawa jeśli masz np. 10 atrybutów i wybierasz po różnych ich kombinacjach.

0
yarel napisał(a):

edycja:
A jeśli masz tylko 3 przypadki, to co stoi na przeszkodzie, żeby mieć jest nazwane jako osobne findXZY i wołać odpowiedni wariant per przypadek użycia?

Popieram. Spring Data daje trochę, ale w zamian tworzy straszną monokulturę myślenia, jak pola kukurydzy za Chruszczowa
Ciągle mozna coś wyselekcjonowac KODEM, rewelacja ;)

Inna sprawa jeśli masz np. 10 atrybutów i wybierasz po różnych ich kombinacjach.

Dla 10 też nie bał bym się kodu

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