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

Java 如何在mysema框架中使用SimpleExpression.eqAny?,java,querydsl,mysema,Java,Querydsl,Mysema,我正在考虑在查询中进行过滤,以返回位置与查询位置相交的实体。从方法签名来看,eqAny方法似乎是一条出路 唯一的缺点是它不接受集合,而只接受CollectionExpression。如何从我的集合创建CollectionExpression 我的(非编译)代码大致如下: import com.mysema.query.types.expr.BooleanExpression; //… StringPath locations = … //irrelevant BooleanExpression

我正在考虑在查询中进行过滤,以返回
位置
与查询位置相交的实体。从方法签名来看,
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<>())));
import com.mysema.query.types.expr.booleanpression;
//…
StringPath位置=…//不相关
booleanpression predicate=anotherPredicate.and(qbuilder.locations.eqAny(query.getLocations().orElse(newhashset()));

我很肯定你在这么长时间后找到了解决方案,但是,由于我面临同样的问题(并且找不到任何关于如何解决的帮助),我会发布我自己的解决方案,以防有人在同一个地方

首先,我们假设我的班级是:

public class MyClass {

    private String id;
    private String name;

    // All the Getters, Setters, Constructors, etc
}
因此,等效的自动生成的QueryDSL类将是
QMyClass

我所做的是通过迭代我的集合来手动创建布尔表达式,如下所示(假设集合是
列表ID
列表名称

QMyClass myClass=QMyClass.myClass;
布尔表达式be=null;
如果(!CollectionUtils.isEmpty(ids)){
be=myClass.id.equalsIgnoreCase(id.get(0));
如果(ids.size()>1){
对于(inti=1;i1){
对于(int i=1;i
在那之后,剩下的事情就简单了。我只需如下扩展MyClassRepository接口(为了利用QueryDSL功能)

公共接口MyClassRepository扩展了JpaRepository、QueryDSL谓词执行器{
...
}
最后,我使用了findAll存储库方法(由于QueryDSL,现在默认扩展),如下所示(我在我的案例中也使用了可分页的方法,但这当然是可选的)

Page myClassList=this.myClassRepository(be,可分页);
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);