1

我在我的应用程序中使用 Spring Data 和 JPA,我正在尝试为动态标准 API 实现 QueryDSL。就我在标准中发送特定值而言,使用以下谓词可以正常工作:

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

但是,如果我收到多个过滤器参数并希望使用 Map 来存储 (column_name - column_value) 的键值对以动态派生查询,我将无法创建相同的查询。意味着我知道我可以在 Predicate 中使用 and 或其他运算符添加尽可能多的条件,但我需要使用多少表达式仅在运行时决定,因此无法找出形成正确表达式的方法。

这是一些代码信息

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

现在过滤器可以从 1 到 n 个字段变化,其值类似于 filter 1 = product_id=123,title=test filter 2 =title= xyz, code= abc, vendor=pqr

所以我将使用 map 来存储键值对(title-xyz 等)并希望动态构造查询。

我经历了许多教程,但到目前为止找不到适合我的条件的解决方案。我也想过在迭代 map 循环时使用 Switch,但是如何组合所有表达式/谓词,我不知道。

如果我找不到解决方案,我可能会使用 JPA Criteria API,我们可以在其中轻松使用谓词列表。让我知道是否需要任何信息来帮助我。

谢谢

4

1 回答 1

3

我可以通过以下步骤解决我的问题:我使用了 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()));    
        }
    }

在这里,构建器管理从 Map 添加条目(以键值对的形式给出列名和值),并且 PathBuilder 用于将列名设置为参数。

通过使用它,我们可以有效地使用 QueryDSL 来创建动态查询。

谢谢

于 2017-10-19T06:45:16.693 回答