Składanie zapytania SQL w Java

Składanie zapytania SQL w Java
CH
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 2 lata
  • Postów:656
0

Mam do zrobienia program do przeglądania bazy danych. Wygląda to tak, że do zaprezentowania jest tabela HTML, która ma pewną ilość kolumn. Zasadniczo jest ona oparta o tabelę z bazy, ale w kolumnie może być bezpośrednio zawartość kolumny z bazy, albo coś odczytanego na podstawie wartości z tabeli (podselekt z kluczem obcym), albo jakaś agregacja, max czy min. W interfejsie użytkownik może sobie wybrać które kolumny mają być widoczne i dla każdej kolumny może ustawić filtr.
Na podstawie tego trzeba wygenerować zapytanie SQL. W zależności od wybranych kolumn będzie różna lista kolumn po SELECT i ewentualnie różne JOINy do głównej tabeli.
W zależności od wybranych filtrów będą różne warunki po WHERE. Potem do tego trzeba dołączyć parametry zapytania.
Czy jest jakaś biblioteka w Java, która służy do budowania takich warunkowych zapytań jakoś? Jak można to ugryźć inaczej, niż sklejać stringi dla wybranych kolumn?
Będę wdzięczny za pomysły.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
1

jeden i pół terabajta powinno wystarczyć każdemu
CH
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 2 lata
  • Postów:656
0
jarekr000000 napisał(a):

http://www.querydsl.com/
https://www.jooq.org/

Nie do końca jestem przekonany, czy to się nadaje. Jest tam taki przykład:

Kopiuj
List<Person> persons = queryFactory.selectFrom(person)
  .where(
    person.firstName.eq("John"),
    person.lastName.eq("Doe"))
  .fetch();

Od razu jest założone, że pobieram Person, a więc bez możliwości wybrania pól. Dalej w WHERE mam dwa warunki wpisane na sztywno, a ja chcę tu mieć możliwość wybierania warunków, np. listy lub zakresy id'ków albo dat, tekst do wyszukiwania LIKE, wszystko opcjonalne.
Rozumiem, że te biblioteki umożliwiają składanie zapytań bez użycia SQL, ale zapytanie musi być znane na etapie kompilacji.
Chyba, że coś źle rozumiem, albo nie znalazłem odpowiednich przykładów.

FI
filemonczyk
jooq ma dosc rozbudowane api spokojnie takie query sobie napiszesz, przy okazji pocwiczysz sqla.
1

Polecam CriteriaBuilder

S1
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:38
1

SQLite + ORMlite

hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:8 dni
1

@chodnik: a co powiesz na coś takiego

Kopiuj
Query searchBy(Query q, String search) {
  if (search != null) {
    return q.where(person.first.name.ilike(search + "%"));
  } else {
    return q;
  }
}

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
1
chodnik napisał(a):
jarekr000000 napisał(a):

http://www.querydsl.com/
https://www.jooq.org/

Nie do końca jestem przekonany, czy to się nadaje. Jest tam taki przykład:

Kopiuj
List<Person> persons = queryFactory.selectFrom(person)
  .where(
    person.firstName.eq("John"),
    person.lastName.eq("Doe"))
  .fetch();

Querydsl. Jest wszystko co trzeba - przykład pierwszy z brzegu z mojego systemu (zanonimizowany):

Kopiuj
.select(bla.reportDate,
                        bla.etwasSegment,
                        bla.ciasteczko,
                        bla.skomplikowanie,
                        bla.id.count()).from(blablki)
                .where(predicate)
                .groupBy(bla.reportDate, bla.etwasSegment, bla.ciasteczko, bla.skomplikowanie).
                        orderBy(bla.reportDate.asc()).fetch();

A predicate - to skladane właśnie z gui wyrażenie. Andy , ORy wszystko ich DSLem.

W JOOQ analogicznie.


jeden i pół terabajta powinno wystarczyć każdemu
CH
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 2 lata
  • Postów:656
0

Rzeczywiście wygląda na to, że jOOQ i QueryDSL dadzą radę zbudować takie zapytania. Natomiast teraz wydaje mi się, że główny problem, to będzie polegał na dobraniu warunków co do tego query dodać, a wtórną sprawą będzie to jak je utworzyć. Ale to już inny temat. Dzięki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.