Składanie zapytania SQL w Java

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.

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:

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.

1

Polecam CriteriaBuilder

1

SQLite + ORMlite

1

@chodnik: a co powiesz na coś takiego

Query searchBy(Query q, String search) {
  if (search != null) {
    return q.where(person.first.name.ilike(search + "%"));
  } else {
    return q;
  }
}
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:

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):

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

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.

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