在 QueryDSL 和 spring 数据 JPA 中使用动态过滤器映射创建查询

Query creation using dynamic filter map in QueryDSL and spring data JPA

我在我的应用程序中使用 Spring 数据和 JPA,我正在尝试为动态标准 API 实施 QueryDSL。至于我在条件中发送特定值,使用以下谓词可以正常工作:

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

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

这里是一些代码信息

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

现在过滤器可以从 1 到 n 个字段变化,其值如下 过滤器 1 = product_id=123,标题=测试 过滤器 2 =title= xyz, code= abc, vendor=pqr

所以我将使用 map 来存储 key-value 对(title-xyz 等等)并且想动态构造查询。

我看了很多教程,但到目前为止找不到适合我的情况的解决方案。我想过在迭代地图循环时也使用 Switch,但是如何合并所有 expressions/predicates,我不知道。

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

谢谢

我可以通过以下步骤解决我的问题: 我使用了 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来创建动态查询。

谢谢