gpt4 book ai didi

java - 如何在 mysema 框架中使用 SimpleExpression.eqAny?

转载 作者:行者123 更新时间:2023-12-01 04:52:54 24 4
gpt4 key购买 nike

我正在查看在我的查询中进行过滤以返回 locations 的实体。与查询位置相交。从方法签名看来 eqAny方法是要走的路。

唯一的缺点是它不接受集合,而只接受 CollectionExpression。如何从我的 Collection 中创建 CollectionExpression?

我的(非编译)代码是这样的:

import com.mysema.query.types.expr.BooleanExpression;
//…
StringPath locations = … //irrelevant
BooleanExpression predicate = anotherPredicate.and(qbuilder.locations.eqAny(query.getLocations().orElse(new HashSet<>())));

最佳答案

我很确定您在很长一段时间后找到了解决方案,但是,由于我遇到了同样的问题(并且找不到有关如何解决的任何帮助),因此我发布了自己的解决方案,以防有人在同一个地方。

首先,假设我的类(class)如下,

public class MyClass {

private String id;
private String name;

// All the Getters, Setters, Constructors, etc
}

因此, 等效的自动生成的 QueryDSL 类 将是 QMyClass
我所做的是 通过遍历我的集合手动创建我的 BooleanExpression ,类似于以下内容(假设集合是 List<String> idsList<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)));
}
}
}

在那之后,剩下的就很容易了。我只需要扩展 MyClassRepository 接口(interface)如下(为了利用 QueryDSL 功能),
public interface MyClassRepository extends extends JpaRepository<MyClass, Serializable>, QuerydslPredicateExecutor {

...

}

最后,我使用了 查找全部 存储库方法(由于QueryDSL,现在默认扩展)如下(我也使用了Pageable,但这当然是可选的),
Page<MyClass> myClassList = this.myClassRepository(be, pageable);

关于java - 如何在 mysema 框架中使用 SimpleExpression.eqAny?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35020633/

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