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

时间:2017-10-14 08:05:25

标签: jpa spring-data querydsl jpa-criteria

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

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

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

以下是一些代码信息

@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等),并希望动态构造查询。

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

如果我找不到解决方案,可能我会使用JPA Criteria API,我们可以轻松使用List of Predicates。 如果有任何信息需要帮助我,请告诉我。

由于

1 个答案:

答案 0 :(得分:2)

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

由于