morphia java,java – Morphia中的复杂AND-OR查询

我一直在尝试组合Query接口的and()和or()方法来创建一组条件,其中有2个条件列表,并且必须满足每个条件中的至少一个条件.

我读了this discussion并且一直在尝试使用Query.and()来组合我的两个$或子句.

基本上,我想说:

Criteria[] arrayA;

Criteria[] arrayB;

// Programatically populate both arrays

Query q = dao.createQuery().and(

q.or(arrayA),

q.or(arrayB)

);

我正在使用标准数组,因为我必须遍历几个不同的输入以生成我需要的特定条件,这种方法适用于我只使用单个$或者,但我无法让Morphia生成查询我希望当我尝试在$中包含$或子句时,如上所述.我发现没有$和查询,第二个$或者已经覆盖了第一个,就好像我只是简单地调用了或()两次.

例如,我希望生成一个如下查询:

{

"$and": {

"0": {

"$or": {

"0": //Some criteria,

"1": //Some criteria,

"2": //Some criteria,

}

},

"1": {

"$or": {

"0": //Some other criteria,

"1": //Some other criteria,

"2": //Some other criteria,

}

}

}

但是,我只是得到这样的查询:

{

"$or": {

"0": //Some other criteria,

"1": //Some other criteria,

"2": //Some other criteria,

}

}

我看不到很多文档,但是看一下测试用例,这似乎是解决这个问题的正确方法.任何人都可以帮助解释为什么这不符合我的预期吗?

编辑0:

更新:重新审视这个,我已经检查了Morphia测试代码,并且每件事情都运行良好,我一直无法在测试代码中重现我的问题.

因此,我创建了一个新项目来尝试获取我想要的查询的工作示例.但是,即使使用准系统测试项目,我也遇到了同样的问题.

该项目已经成熟,POM是:

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

test

test

0.0.1-SNAPSHOT

Test

com.google.code.morphia

morphia

0.99

org.mongodb

mongo-java-driver

2.7.3

我有一个TestEntity类:

import java.util.Map;

import com.google.code.morphia.annotations.Entity;

@Entity

public class TestEntity {

Map map;

}

最后我的测试类:

import java.net.UnknownHostException;

import java.util.HashMap;

import java.util.Map;

import com.google.code.morphia.Datastore;

import com.google.code.morphia.Morphia;

import com.google.code.morphia.query.Query;

import com.google.code.morphia.query.QueryImpl;

import com.mongodb.Mongo;

import com.mongodb.MongoException;

public class Test {

static Mongo mongo;

static Morphia m;

static Datastore ds;

static {

mongo = null;

try {

mongo = new Mongo();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (MongoException e) {

e.printStackTrace();

}

m = new Morphia();

ds = m.createDatastore(mongo, "test");

}

public static void main(String[] args) {

populate();

query();

}

public static void query() {

Query q = ds.createQuery(TestEntity.class);

q.and(q.or(q.criteria("map.field1").exists()),

q.or(q.criteria("map.field2").exists()));

Iterable i = q.fetch();

for (TestEntity e : i) {

System.out.println("Result= " + e.map);

}

QueryImpl qi = (QueryImpl) q;

System.out

.println("Query= " + qi.prepareCursor().getQuery().toString());

}

public static void populate() {

TestEntity e = new TestEntity();

Map map = new HashMap();

map.put("field1", 1);

map.put("field2", 2);

e.map = map;

ds.save(e);

}

}

对我来说,上面的代码不会产生正确的$和查询,但我不明白为什么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值