2017-10-14 1 views
0

Ich verwende Spring Data und JPA in meiner Anwendung und ich versuche, QueryDSL für dynamische Kriterien API zu implementieren. Soweit, wenn ich bestimmte Werte in Kriterien senden, es funktioniert gut unter Prädikat mit:Abfrageerstellung mit dynamischer Filterzuordnung in QueryDSL und Federdaten JPA

Predicate predicate = QProductInfo.productInfo.shopName.eq(shopName).and(QProductInfo.productInfo.productType.eq(productType)); 

Aber wenn ich mehrere Filterparameter empfangen und eine Karte verwenden möchten Schlüssel-Wert zu speichern Paar (column_name - spalten) Um eine Abfrage dynamisch abzuleiten, kann ich keine Abfrage für dieselbe erstellen. Bedeutet, ich weiß, ich kann so viele Bedingungen mit und oder anderen Operator in Prädikat hinzufügen, aber genau, wie viele Ausdruck ich brauche, wird nur zur Laufzeit entschieden, so dass nicht in der Lage, den richtigen Ausdruck zu bilden. Hier

ist einige Code-Informationen

@Entity 
Public class ProductInfo{ 
productId; 
title; 
vendor; 
code; 
.... and more 
} 

Jetzt filtern kann von 1 bis n Felder mit Werten variieren wie Filter 1 = product_id = 123, title = Test Filter 2 = title = xyz, code = abc , vendor = pqr

Also werde ich verwenden, um Schlüssel-Wert-Paar (title-xyz und so weiter) zu speichern und möchte Abfrage dynamisch erstellen.

Ich ging durch viele Tutorials, konnte aber bisher keine passende Lösung für meine Bedingungen finden. Ich dachte an die Verwendung von Switch, während ich die Schleife für die Map wiederhole, aber wie man alle Ausdrücke/Prädikate koppelt, ich bekomme keine Ahnung.

Wenn ich keine Lösung finde, werde ich wahrscheinlich JPA Criteria API verwenden, wo wir die Liste der Prädikate einfach verwenden können. Lassen Sie mich wissen, ob irgendwelche Informationen erforderlich sind, um mir hier zu helfen.

Dank

+0

Sie können BooleanBuilder verwenden, der Prädikat implementiert. http://www.querydsl.com/static/querydsl/3.6.3/apidocs/com/mysema/query/BooleanBuilder.html. Wenn die Parameter von einer Spring-Web-App stammen, können Sie das Prädikat automatisch erstellen lassen https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling # querydsl-web-support –

+0

Danke Alan. Ich werde versuchen, BooleanBuilder effizienter zu verwenden. Obwohl ich immer noch den Verdacht habe, wie man das Objektattribut zur Laufzeit setzt, bedeutet dies, dass Schlüssel und Wert beide zur Laufzeit kommen, also wie man den Schlüssel als qproductInfo.ProductInfo verwendet. .eq (map value); Ich versuche es und werde zurück kommentieren. – yateen

Antwort

0

konnte ich kann mein Problem mit folgenden Schritten beheben: verwendete ich BooleanBuilder und PathBuilder. Hier

ist Code-Snippet:

BooleanBuilder builder = new BooleanBuilder(); 
PathBuilder<ProductInfo> path = new PathBuilder<>(ProductInfo.class, "productInfo"); 
    if(criteriaMap != null && !criteriaMap.isEmpty()) { 
     for (Map.Entry<String, String> entry : criteriaMap.entrySet()) { 
      builder.and(path.getString(entry.getKey()).eq(entry.getValue()));  
     } 
    } 

Hier Builder verwalten Einträge aus Map hinzuzufügen (die Spaltennamen und Wert in Form von Schlüssel-Wert-Paar gibt) und PathBuilder verwendet wird Spaltennamen als Parameter einzustellen .

Mithilfe von diesem können wir QueryDSL effizient zum Erstellen dynamischer Abfragen verwenden.

Danke