2017-10-14 5 views
0

J'utilise Spring Data et JPA dans mon application et j'essaie d'implémenter QueryDSL pour l'API de critères dynamiques. En ce qui concerne si j'envoie des valeurs spécifiques dans les critères, il fonctionne très bien en dessous de prédicats:Création de requêtes à l'aide de mappages de filtres dynamiques dans QueryDSL et de données de ressort JPA

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

Mais si je reçois des paramètres de filtre multiples et que vous souhaitez utiliser une carte pour stocker paire clé-valeur de (nom_colonne - column_value) Pour dériver une requête dynamiquement, je ne suis pas en mesure de créer une requête pour la même chose. Moyens Je sais que je peux ajouter autant de condition en utilisant et ou autre opérateur dans Predicate mais exactement combien d'expression j'ai besoin d'utiliser est décidé seulement au moment de l'exécution donc je n'arrive pas à trouver la manière de former l'expression correcte.

filtrer Voici quelques informations de code

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

maintenant peut varier de 1 à n champs avec des valeurs comme filtre 1 = product_id = 123, title = Test filtre 2 = title = xyz, code = abc , vendor = pqr

Donc, je vais utiliser la carte pour stocker la paire clé-valeur (title-xyz et ainsi de suite) et je voudrais construire une requête dynamiquement. Je suis passé par beaucoup de tutoriel mais je n'ai pas trouvé de solution appropriée jusqu'à présent pour mes conditions. J'ai pensé utiliser Switch aussi pendant la boucle d'itération pour la carte, mais comment associer toutes les expressions/prédicats, je n'en ai aucune idée.

Si je ne trouve pas de solution, j'utiliserai probablement l'API JPA Criteria où nous pouvons utiliser la liste des prédicats facilement. Informez-moi s'il y a des informations nécessaires pour m'aider ici.

Merci

+0

Vous pouvez utiliser BooleanBuilder qui implémente Predicate. http://www.querydsl.com/static/querydsl/3.6.3/apidocs/com/mysema/query/BooleanBuilder.html. Si les paramètres proviennent d'une application web Spring, vous pouvez également créer automatiquement le Predicate https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling # querydsl-web-support –

+0

Merci Alan. Je vais essayer d'utiliser BooleanBuilder plus efficacement. Bien que je suspecte toujours comment définir l'attribut d'objet à l'exécution signifie la clé et la valeur les deux arrivent l'heure d'exécution ainsi comment utiliser la clé comme qproductInfo.ProductInfo. .eq (valeur de carte); Je l'essaie et je vais commenter. – yateen

Répondre

0

je pouvais en mesure de résoudre mon problème avec les étapes suivantes: I utilisé BooleanBuilder et PathBuilder.

Voici bout de code:

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()));  
     } 
    } 

Ici constructeur réussi à ajouter des entrées de la carte (qui donne le nom de la colonne et la valeur sous forme de paire clé-valeur) et PathBuilder est utilisé pour définir le nom de la colonne en tant que paramètre . En l'utilisant, nous pouvons utiliser QueryDSL efficacement pour créer une requête dynamique.

Merci