当前位置: 首页 > 工具软件 > Morphia > 使用案例 >

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

巩子实
2023-12-01

我一直在尝试组合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);

}

}

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

 类似资料: