gpt4 book ai didi

java - 按元素的多个属性过滤集合 - QueryDSL

转载 作者:搜寻专家 更新时间:2023-11-01 00:55:00 24 4
gpt4 key购买 nike

我正在开发一个基于 QueryDSL 的动态过滤器组件,并使用 SpringData 执行查询。因此我创建了 Predicate来自接收到的数据广告的实例将其传递给 QueryDslPredicateExecutor .对于实体属性的动态访问,我使用通用 PathBuilder键入实体类。

考虑以下(简化的)代码:

class Offer {
List<LanguageToName> names;
}
class LanguageToName {
String name;
String language;
}

当我尝试查询 Offer 时实体,在他们的 Collection 中name具有属性“abc”的元素,我简单地创建谓词如下:

pathBuilder.getCollection("names", LanguageToName.class).any().getString("name")
.like("%" + fieldData.getFieldValue() + "%");

但是,我无法想出一个解决方案来通过使用 PathBuilder 的包含对象的多个属性来过滤集合。 .当我在上面的代码中附加 .and() 时并通过 pathBuilder 再次访问该集合变量,我自然得到的结果相当于用 AND EXISTS... 附加 sql 查询,这不是想要的结果。我也尝试使用 getCollection().contains() , 但我无法创建 Expression<LanguageToName>这将描述这种情况。

有没有办法创建一个Predicate将根据集合中元素的多个属性过滤实体,即查询实体的字段?

最佳答案

我有类似的问题,最后用子查询解决了这个问题(但是,在我看来它只适用于 1 级嵌套)。

我的初始谓词是(它进行了 2 个独立的子查询):

Predicate predicate = codeTable.customer.id.eq(customerId)
.and(codeTable.qualifierResults.any().customerQualifier.type.eq("TARGET_TYPE"))
.and(codeTable.qualifierResults.any().customerQualifier.referenceType.code.eq("TARGET_CODE"));

但我最终得到的正确谓词是:

BooleanExpression customerQualifierCondition = JPAExpressions
.selectFrom(codeTableQualifierResult)
.where(codeTableQualifierResult.in(codeTable.qualifierResults),
codeTableQualifierResult.customerQualifier.type.eq("TARGET_TYPE"),
codeTableQualifierResult.customerQualifier.referenceType.code.eq("TARGET_CODE"))
.exists();
Predicate predicate = codeTable.customer.id.eq(customerId).and(customerQualifierCondition);

我们的想法是编写 1 个单独的子查询,您可以在其中一次应用所有必要的条件(而不是将它们单独应用到您的集合中)。

关于java - 按元素的多个属性过滤集合 - QueryDSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39043196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com