[我正在查询中进行过滤以返回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<>())));
我很确定您经过了很长时间才找到了解决方案,但是,当我遇到相同的问题(并且找不到任何帮助的方式)时,我会发布自己的解决方案,以防有人在同一个地方。
首先,假设我的课程如下,>
将为public class MyClass { private String id; private String name; // All the Getters, Setters, Constructors, etc }
因此,等效的自动生成的QueryDSL类
QMyClass
我所做的是通过遍历我的Collection手动创建我的BooleanExpression
,类似以下内容(假设这些collection是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))); } } }
之后,剩下的就很容易了。我只需要按如下方式扩展MyClassRepository接口(以利用QueryDSL功能),
存储库方法(由于QueryDSL,默认情况下现在扩展为默认情况)(我的情况也使用了Pageable,但这当然是可选的,],public interface MyClassRepository extends extends JpaRepository<MyClass, Serializable>, QuerydslPredicateExecutor { ... }
最后,我使用了findAll
Page<MyClass> myClassList = this.myClassRepository(be, pageable);