Dynamische Liste von Oder Bedingungen
Gegeben sei eine Map parameters die alle Konditionen enthält die abgefragt werden sollen. In der Map ist der Key gleich dem Feldnamen in der Tabelle und der Value der Wert mit dem der Inhalt der Spalte verglichen werden soll.
Map<String, Object> params = ...;
Jetzt kann man die Oder Bedingung mit Jooq dynamisch zusammensetzen.
Condition result =
params
.entrySet()
.stream()
.reduce(
DSL.noCondition(),
(condition, entry) -> condition.or(
// Hier wird mit Hilfe Table.field() das Feld aus der Tabelle nach ihrem Namen gesucht.
// Achtung: Nicht vorhandene Felder führen zu einer NullPointerException.
((Field<Object>) E.field(entry.getKey())).eq(entry.getValue())
),
Condition::or
);
Für alle Einträge in der Map (EntrySet) wird ein Stream erzeugt. Jeder Entry wird mit der Reduce Methode mit Condition::or verknüpft. Initialisiert wird die Reduce Operation mit DSL.noCondition(). Also wenn die Map leer ist, dann wird noCondition() zurückgegeben.