Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在QueryDSL和spring数据JPA中使用动态过滤器映射创建查询_Jpa_Spring Data_Querydsl_Jpa Criteria - Fatal编程技术网

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

在QueryDSL和spring数据JPA中使用动态过滤器映射创建查询,jpa,spring-data,querydsl,jpa-criteria,Jpa,Spring Data,Querydsl,Jpa Criteria,我在我的应用程序中使用Spring数据和JPA,并尝试实现QueryDSL for dynamic criteria API。就我在条件中发送特定值而言,使用以下谓词可以正常工作: Predicate predicate = QProductInfo.productInfo.shopName.eq(shopName).and(QProductInfo.productInfo.productType.eq(productType)); 但是,如果我接收到多个过滤器参数,并希望使用一个映射来存储(

我在我的应用程序中使用Spring数据和JPA,并尝试实现QueryDSL for dynamic criteria API。就我在条件中发送特定值而言,使用以下谓词可以正常工作:

Predicate predicate = QProductInfo.productInfo.shopName.eq(shopName).and(QProductInfo.productInfo.productType.eq(productType));
但是,如果我接收到多个过滤器参数,并希望使用一个映射来存储(column\u name-column\u value)的键值对来动态派生查询,我将无法为同一个参数创建查询。 意味着我知道我可以在谓词中使用and或其他运算符添加尽可能多的条件,但我需要使用的表达式的确切数量仅在运行时决定,因此无法找出形成正确表达式的方法

下面是一些代码信息

@Entity
Public class ProductInfo{
productId;
title;
vendor;
code;
.... and more
}
现在,过滤器可以从1到n个字段不等,其值如下 过滤器1=产品\u id=123,标题=测试 过滤器2=标题=xyz,代码=abc,供应商=pqr

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

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

若我并没有找到解决方案,我可能会使用JPA标准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()));    
        }
    }
BooleanBuilder=newbooleanbuilder();
PathBuilder路径=新的PathBuilder(ProductInfo.class,“ProductInfo”);
if(criteriaMap!=null&!criteriaMap.isEmpty()){
对于(Map.Entry:criteriaMap.entrySet()){
and(path.getString(entry.getKey()).eq(entry.getValue());
}
}
在这里,构建器管理从映射中添加条目(以键值对的形式提供列名和值),PathBuilder用于将列名设置为参数

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


谢谢

您可以使用BooleanBuilder来实现谓词。如果参数来自SpringWeb应用程序,那么您也可以自动构建谓词。我将尝试更有效地使用BooleanBuilder。虽然我仍然怀疑如何在运行时设置object属性意味着key和value都将在运行时出现,那么如何使用key作为qproductInfo.ProductInfo..eq(映射值);我正在尝试,并将作出回应。