在 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来创建动态查询。
谢谢
我在我的应用程序中使用 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来创建动态查询。
谢谢