2017-10-14 101 views
0

我在我的應用程序中使用了Spring Data和JPA,我試圖爲動態標準API實現QueryDSL。至於如果我在標準發送特定的值,它使用下面的謂詞正常工作:在QueryDSL和彈簧數據中使用動態篩選器映射創建查詢JPA

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

但是,如果我收到多個過濾參數,需要使用地圖存儲鍵 - 值對(列 - COLUMN_VALUE)爲了動態派生查詢,我無法爲相同的查詢創建查詢。 意思我知道我可以在Predicate中添加儘可能多的使用和或其他操作符的條件,但是確切地說我需要使用的表達式只有在運行時才能決定,因此無法找出形成正確表達式的方式。

下面是一些代碼信息

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

立即過濾從1到n的字段與值等 濾波器1 = PRODUCT_ID = 123,標題=測試 濾波器2 =標題= XYZ,代碼= ABC可以變化,vendor = pqr

因此,我將使用map來存儲鍵值對(title-xyz等),並且想動態地構造查詢。

我經歷了很多教程,但到目前爲止我找不到合適的解決方案。我還在爲迭代地圖循環的同時使用Switch,但是如何將所有表達式/謂詞關聯起來,我沒有任何想法。

如果我找不到解決方案,可能我會使用JPA Criteria API,我們可以輕鬆地使用Predicates List。 讓我知道是否有任何信息需要幫助我在這裏。

感謝

+0

您可以使用實現謂詞的BooleanBuilder。 http://www.querydsl.com/static/querydsl/3.6.3/apidocs/com/mysema/query/BooleanBuilder.html。如果參數來自Spring Web應用程序,那麼您也可以自動構建謂詞https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling #querydsl-web-support –

+0

謝謝Alan。我將嘗試更有效地使用BooleanBuilder。雖然我仍然懷疑如何在運行時設置對象屬性,但意味着key和value都是運行時間,所以如何使用key作爲qproductInfo.ProductInfo。 .eq(map value); 我正在嘗試,並會回覆評論。 – yateen

回答

0

我可能能夠解決我的問題有以下步驟: 我用BooleanBuilder和PathBuilder。

下面是代碼片斷:

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

這裏助洗劑設法從地圖(其給出列的名稱和值在關鍵值對的形式)和PathBuilder添加條目用於設置列名作爲參數。

通過使用它,我們可以高效地使用QueryDSL創建動態查詢。

謝謝