如何在Play Morphia中动态组合OR查询中的多个条件



我正尝试使用一种构建器模式,根据场景使用多个条件来构建OR查询。就是一个例子

public class Stylist extends Model {
public String firstName;
public String lastName;
public String status;
...
}

如果名字或姓氏与给定字符串匹配,并且状态与另一个字符串匹配,我想搜索Stylist集合。我写的查询如下:

MorphiaQuery query = Stylist.q();
if (some condition) {
query.or(query.criteria("status").equal("PendingApproval"), query.criteria("status").equal(EntityStatus.ACTIVE));    
}
if (some other condition as well) {
query.or(query.criteria("firstName").containsIgnoreCase(name), query.criteria("lastName").containsIgnoreCase(name));
}

当这两个条件都满足时,我看到查询只包含与firstName和lastName相关的条件,即不同的OR条件不会被添加/附加,而是被覆盖。它与附加了所有不同的筛选条件的筛选条件大不相同,您可以轻松地构建包含多个and条件的查询。

我可以通过不同的方式设置条件和构建不同的查询来解决问题,但这似乎不是一种优雅的方式。我做错什么了吗?

我正在使用Play!框架1.2.4和Play Morphia模块版本1.2.5a

更新

更清楚地说,我想对多个OR查询进行AND运算。具体来说,在上述场景中,我想

我想在哪里搜索造型师:

firstName or lastName contains supplied name AND
status equals ACTIVE or PENDING_APPROVAL.

我已经能够通过以下方式直接在Mongo-shell上构建查询:

db.stylesters.find({$和:[{$或:[{status:"PENDING_APPROVAL"},{status:"ACTIVE"}]},{$或;[{firstName:{"$regex":"test","$options":"i"}},{lastName:{"$regx":;

但一直无法通过查询API的方法来实现同样的目的。这是我的尝试:

Query<Stylist> query = MorphiaPlugin.ds().find(Stylist.class);
CriteriaContainer or3 = query.or(query.criteria("firstName").containsIgnoreCase(name), query.criteria("lastName").containsIgnoreCase(name));
CriteriaContainer or4 = query.or(query.criteria("status").equal("PENDING_APPROVAL"), query.criteria("status").equal("ACTIVE"));
query.and(or3, or4);

query.toString()产生以下输出:{"$或":[{"status":"PENDING_APPROVAL"},{"state":"ACTIVE"}]}

不确定,我在哪里失踪了?

我想有两种方法可以处理您的案例:

首先,使用List<Criteria>

MorphiaQuery query = Stylist.q();
List<Criteria> l = new ArrayList<Criteria>()
if (some condition) {
l.add(query.criteria("status").equals("PendingApproval");
l.add(query.criteria("status").equal(EntityStatus.ACTIVE));
}
if (some other conditional as well) {
l.add(query.criteria("firstName").containsIgnoreCase(name));
l.add(query.criteria("lastName").containsIgnoreCase(name));
}
query.or(l.toArray());

第二,使用CritieriaContainer

MorphiaQuery query = Stylist.q();
CriteriaContainer cc = null;
if (some condition) {
cc = query.or(query.criteria("status").equal("PendingApproval"), query.criteria("status").equal(EntityStatus.ACTIVE));
}
if (some other condition) {
if (null != cc) query.or(cc, query.criteria("firstName").containsIgnoreCase(name), query.criteria("lastName").containsIgnoreCase(name));
else query.or(query.criteria("firstName").containsIgnoreCase(name), query.criteria("lastName").containsIgnoreCase(name));
}

最新更新