我正在查看我的查询中的过滤,以返回locations
与查询位置相交的实体。从方法签名看,eqAny
方法似乎是可行的方法。
唯一的缺点是它不接受集合,而只接受CollectionExpression。如何从我的集合中创建CollectionExpression?
我的(非编译)代码是这样的:
import com.mysema.query.types.expr.BooleanExpression;
//…
StringPath locations = … //irrelevant
BooleanExpression predicate = anotherPredicate.and(qbuilder.locations.eqAny(query.getLocations().orElse(new HashSet<>())));
答案 0 :(得分:0)
我很确定您会在很长时间后找到解决方案,但是,由于我遇到了同样的问题(并且在执行该操作方面找不到任何帮助),我会发布自己的解决方案,以防有人在同一个地方
首先,假设我的课程是
public class MyClass {
private String id;
private String name;
// All the Getters, Setters, Constructors, etc
}
因此,等效的自动生成的QueryDSL类将为QMyClass
我要做的是通过遍历我的Collection 手动创建我的BooleanExpression ,如下所示(假设这些集合是 在那之后,剩下的就很容易了。我只需要按如下方式扩展MyClassRepository接口(以利用QueryDSL功能), 最后,我使用了 findAll 存储库方法(由于QueryDSL,默认情况下现在默认扩展)如下(我也使用了Pageable,但这当然是可选的),>
List<String> ids
和List<String> names
)>
QMyClass myClass = QMyClass.myClass;
BooleanExpression be = null;
if (!CollectionUtils.isEmpty(ids)) {
be = myClass.id.equalsIgnoreCase(ids.get(0));
if (ids.size() > 1) {
for (int i = 1; i < ids.size(); i++) {
be = be.or(myClass.id.equalsIgnoreCase(ids.get(i)));
}
}
}
if (!CollectionUtils.isEmpty(names)) {
be = be.and(myClass.name.equalsIgnoreCase(names.get(0)));
if (names.size() > 1) {
for (int i = 1; i < names.size(); i++) {
be = be.or(myClass.name.equalsIgnoreCase(names.get(i)));
}
}
}
public interface MyClassRepository extends extends JpaRepository<MyClass, Serializable>, QuerydslPredicateExecutor {
...
}
Page<MyClass> myClassList = this.myClassRepository(be, pageable);