2017-11-22 5 views
0

Verwendung von QueryDSL zum dynamischen Erstellen und Ketten von Prädikaten.Dynamische Prädikatsverkettung QueryDSL

Ich habe eine Benutzeroberfläche mit einer Datentabelle. Jede Spalte enthält ein Feld, in das Sie einen Filterbegriff eingeben können. Wie so:

UI

Im Beispiel oben eventno filter = "0288" und Adressfilter = "Laufwerk". Diese werden dann von der Benutzeroberfläche an das Back-End in einem Paginierungsobjekt gesendet, das eine Zuordnung von Spaltennamen und Filterzeichenfolgen enthält. Wie so:

Pagination

In meinem Backend mit QueryDSL muß ich jetzt dynamisch ein Prädikat Konstrukt basiert auf den Bedingungen für die Spalten vorgesehen. Ich habe versucht, dies nur für die Adresse Ereignis und Adresse Spalte, aber es scheint nicht beide zu filtern.

public Page<EpisodeDashboard> getPage(int pageNumber, int pageSize, Sort sort, PaginationCriteria pagination) { 
    BooleanBuilder where = new BooleanBuilder(); 
    if (pagination.getFilterBy().getMapOfFilters().get("eventno")!=null) { 
     where.and(qEpisode.eventno.containsIgnoreCase(pagination.getFilterBy().getMapOfFilters().get("eventno"))); 
     } 
    if (pagination.getFilterBy().getMapOfFilters().get("address")!=null) { 
     where.and(qEpisode.address.formattedAddress.containsIgnoreCase(pagination.getFilterBy().getMapOfFilters().get("address"))); 
     } 
    List<Episode> e = episodeRepository.findAll(where); 

Ich möchte wahrscheinlich etwas mit einem für jeden Schlüssel/Wert in der Hashmap, um die Prädikate dynamisch zu konstruieren.

+0

Was meinst du mit "scheint nicht"? Haben Sie die Protokollierung der generierten SQL-Anweisungen aktiviert, um zu sehen, was passiert? – Brian

Antwort

0

Der obige Code tatsächlich funktioniert, aber:

episodeRepository.findAll(where); 

Gibt eine iterable und die meisten meiner Projekt verwendet Liste. Also habe ich die Episode Repo mit einer Überschreibung zu:

@Override 
    List<Episode> findAll(Predicate predicate); 

geändert Jetzt wird eine Liste zurückgegeben und der Code funktioniert. Eine Verbesserung dieser Antwort wäre, wenn die "if" -Anweisungen durch Iterieren über den Paging-Filter hashmap generiert werden könnten.