java split + JPQL/SQL

0

Pytanie, mam w javie wartość zmiennej np. "Marek, Rafał, Mariusz, Adam" jako jeden string.

W bazie danych w kolumnie mam wartość jako całość "Rafał, Mariusz, Marek, Adam"

Jak najlepiej najniższym kosztem w jednym zapytaniu sprawdzić czy wartości ze zmiennej z javy znajdują się w kolumnie w bazie danych?
W podstawie korzystam ze spring data, ale zakładam że bede musiał skorzystać z jpql/native sql

0

A nie działa Ci coś w stylu?

List<MyData> findByTwojaKolumnaZImionamiContains(String title);

Googlałeś wgl temat?
https://www.baeldung.com/spring-jpa-like-queries

0
MrMadMatt napisał(a):

A nie działa Ci coś w stylu?

List<MyData> findByTwojaKolumnaZImionamiContains(String title);

Googlałeś wgl temat?
https://www.baeldung.com/spring-jpa-like-queries

Nie, chodzi o to, że do javy dostaje jeden string z imionami, ale mogą być one w różnej kolejności ("Marek, Rafał, Mariusz, Adam"), zas w bazie w kolumnie będzie wartość "Rafał, Mariusz, Marek, Adam".
Więc musiałbym to pewnie zesplitować w javie i później taką liste imion przesłać w argumencie metody do repo, tylko teraz jak sprawdzić czy ta lista imion z argumentu metody występuje w tej kolumnie w bazie?

4

To jest jakieś nieporozumienie generalnie :)

  1. Daj więcej kontekstu. Po co chcesz robić takie dziwne sprawdzenie?
  2. Dlaczego w jednej kolumnie masz zbiór wartości? Prawdopodobnie to powinna być osobna tabela.
0

to może na innym przykładzie, w javie w stringu przychodzą mi dane z domeny np. "C=PL, ST=Pomorskie, L=Gdynia, O=Company, CN=Example",
ale w bazie danych te wartości mogą mieć tylko inną kolejność czyli "CN=Example, O=Compan, L=Gdyniay, ST=Pomorskie, C=PL"

Wartości domeny będą te same, ale kolejność może być zmieniona, czy moge w jakiś sposób zrobić takie porównanie?

2

Dokładnie to samo pytanie:
2. Dlaczego w jednej kolumnie masz zbiór wartości?
Jak sobie pościelisz tak się wyśpisz, pościeliłeś ostrym tłuczonym szkłem :D

1
mariusz00 napisał(a):

Wartości domeny będą te same, ale kolejność może być zmieniona, czy moge w jakiś sposób zrobić takie porównanie?

Jeśli nie chcesz przeprojektowywać struktury to odpowiedź brzmi: zależy od bazy SQL, jaką masz pod spodem.
MSSQL ma funkcję STRING_SPLIT, Oracle też ma coś podobnego.

0

Raczej nie będe się kopał z koniem, pobrałem potrzebną encje z bazy, a same wartości domeny zwalidowałem już w javie.

Skorzystałem z pakietu:
javax.naming.ldap.LdapName

dzięki temu mogłem łatwo pobrać atrybuty klucz/wartość z domeny której wartości są w jednym stringu tzn:

    public List<Rdn> getAttributes(String domain) {
         LdapName ldapName = new LdapName(domain);
         return ldapName.getRdns();
    }

później porównałem sobie tylko dwie listy i tyle

Ale dzięki za wskazówki, przydały się :)

2
mariusz00 napisał(a):

Ale dzięki za wskazówki, przydały się :)

Jak widać nie bardzo się przydały, albo nie zrozumiałeś wskazówek albo kompletnie ich olałeś.

1

Najniższym kosztem, to zrobić dobrze strukturę. Pojedyncze pole w relacyjnej bazie danych nigdy nie powinno przechowywać wielu wartości. https://pl.wikipedia.org/wiki/Posta%C4%87_normalna_(bazy_danych)

--edit
Jeżeli nie wchodzi w grę, to:
select * from whatever where column like '%Marek%'

A czy będzie tanio, czy nie tanio, to już zależy od bazy i założonych na tej kolumnie indeksów.

0

Może taki pomysł:

  • Jednorazowo dla każdego rekordu tego typu splitujemy w Jave wg przecinku sortujemy alfabetycznie sklejamy przecinkami i wrzucamy z powrotem.
  • Jak chcemy znaleźć to splitujemy w Jave wg przecinku sortujemy alfabetycznie sklejamy przecinkami i szukamy takiej wartości.

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