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



我在应用程序中使用SpringData和JPA,并尝试为动态标准API实现QueryDSL。就我在标准中发送特定值而言,使用以下谓词可以很好地工作:

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

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

这是一些代码信息

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

现在,过滤器可以在1到n个字段之间变化,其值如下filter 1=product_id=123,title=测试过滤器2=标题=xyz,代码=abc,供应商=pqr

因此,我将使用map来存储键值对(title xyz等),并希望动态构建查询。

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

如果我找不到解决方案,我可能会使用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来创建动态查询。

感谢

最新更新