Mongodb 的ORM框架 Morphia 之 Query接口
来源:互联网 发布:淘宝商品数据包 编辑:程序博客网 时间:2024/06/04 18:07
Query接口是个相当直接的方法。他允许非常确切的过滤方式(基于属性),排序,一个偏移和限制返回结果的数量。
query实现也实现了QueryResults接口,此接口允许在查询中访问结果。
Filter(过滤)
一般的.filter(criteria, value)语法被支持。标准语法是属性名和操作("field > ", or "field in")的整合。所有的语法被逻辑"and" 暗暗的联系在一起。
1
Datastore ds = ...
2
Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
);
3
Datastore ds = ... Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
);
查询foo在12和30之间的实体对象,的方法如下:
1
Datastore ds = ...
2
3
Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
).filter(
"foo <"
,
30
);
4
Datastore ds = ... Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
).filter(
"foo <"
,
30
);
Operators(操作符)
操作符被用在fileter(...)和MongoDB的查询操作紧密的匹配。
operatormongo op=$eq!=, <>$ne>,<,>=,<=$gt,$lt,$gte,$ltein$innin$ninelem$elemMatchexists$existsall$allsize$size...... 操作符被用在fileter(...)和MongoDB的查询操作紧密的匹配。
operatormongo op=$eq!=, <>$ne>,<,>=,<=$gt,$lt,$gte,$ltein$innin$ninelem$elemMatchexists$existsall$allsize$size......
Fluent Interface
沿着.filter(...)方法,这里有个流水型的方法。这些提供一个非常已读的格式。
fluent 接口以field(name)开始。接着一下任何一个方法都可以添加到这个格式中,
1
Query q = ds.createQuery(MyEntity.
class
).field(
"foo"
).equal(
1
);
2
3
q.field(
"bar"
).greaterThan(
12
);
4
q.field(
"bar"
).lessThan(
40
);
methodoperationcommentexists$exists doesNotExist$exists greaterThan,greatherThanOrEq,lessThan,lessThanOrEe$gt,$gte,$lt,$lte equal,notEqual$eq, $ne hasThisOne$eq hasAllOf$all hasAnyOf$in hasNoneOf$nin hasThisElement$elemMatch sizeEq$size
Geo-spatial
所有的geo-spatial方法都被分解为"near, 和within"。所有的near查询将会产生结果,按远程和最近的结果。
下面的方法接受一个球形的最后参数,表名他们是否应该使用$sphere选项。
01
@Entity
02
static
private
class
Place {
03
@Id
protected
ObjectId id;
04
protected
String name =
""
;
05
@Indexed
(IndexDirection.GEO2D)
06
protected
double
[] loc =
null
;
07
08
public
Place(String name,
double
[] loc) {
09
this
.name = name;
10
this
.loc = loc; }
11
12
private
Place() {}
13
}
14
15
Place place1 =
new
Place(
"place1"
,
new
double
[] {
1
,
1
});
16
ds.save(place1);
17
18
Place found = ds.find(Place.
class
).field(
"loc"
).near(, ).get();
使用流式查询接口时你也可以像一下这样使用"or"查询
1
Query<Person> q = ad.createQuery(Person.
class
);
2
q.or(
3
q.criteria(
"firstName"
).equal(
"scott"
),
4
q.criteria(
"lastName"
).equal(
"scott"
)
5
);
属性名也可以像在本地MongoDB查询中那样使用"."标识
1
Query q = ds.createQuery(Person.
class
).field(
"addresses.city"
).equal(
"San Francisco"
);
2
//or with filter, or with this helper method
3
Query q = ds.find(Person.
class
,
"addresses.city"
,
"San Francisco"
);
验证被应用在属性名,和数据类型上。如果在查询中使用的属性名在指定的java类中没有找到将会抛出一个异常。如果一个属性名被“.”标识连接,那么这个表达式的每个
部分都将会在指定的java对象中进行验证(有一个异常Map来记录那个属性 名被跳过)。
数据类型问题(比较属性类型和参数类型)作为警告被记录,由于服务器可能会把数据强制转换,或者你发送意思不那么的有意义;服务器使用字节表示一些参数,所以有些类型
不同的数值也可以匹配(例如数字)。
Disabling validation(是验证无效)
通过调用disableValidation()可以使验证变为无效,在开始等于查询或每个查询语句上。
1
Datastore ds = ...
2
Query q = ds.createQuery(MyEntity.
class
).disableValidation();
3
4
//or it can be disabled for just one filter
5
6
Query q = ds.createQuery(MyEntity.
class
).disableValidation().filter(
"someOldField"
, value).enableValidation().filter(
"realField"
, otherVal);
Sort(排序)
你可以通过一个或多个属性名对结果进行升序或降序排序
1
Datastore ds = ...
2
Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
).order(
"dateAdded"
);
3
...
// desc order
4
Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
).order(
"-dateAdded"
);
5
...
// asc dateAdded, desc foo
6
Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
).order(
"dateAdded, -foo"
);
你可以通过在查询是指定一个偏移值是服务器跳过一些记录元素。这将比使用几个属性的范围进行查询要低效的多。如下所示:
1
Datastore ds = ...
2
Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
).offset(
1000
);
Ignoring Fields(忽略属性)
MongoDB也支持只返回一些属性。这在应用中显得有点奇怪,但是这个在修剪掉一部分嵌套时是非常有用的方法。这将会导致局部实体对象,应该不慎重使用,如果可以的话。
01
Datastore ds = ...
02
MyEntity e = ds.createQuery(MyEntity.
class
).retrievedFields(
true
,
"foo"
).get();
03
04
val = e.getFoo();
// only field returned
05
06
...
07
08
MyEntity e = ds.createQuery(MyEntity.
class
).retrievedFields(
false
,
"foo"
).get();
09
10
val = e.getFoo();
// only field not returned
11
Datastore ds = ... MyEntity e = ds.createQuery(MyEntity.
class
).retrievedFields(
true
,
"foo"
).get(); val = e.getFoo();
// only field returned ... MyEntity e = ds.createQuery(MyEntity.class).retrievedFields(false, "foo").get(); val = e.getFoo(); // only field not returned
仅仅访问QueryResults的一个方法就可以返回你的数据。没有一个方法会影响Query。他们将会单独的离开Query,因此你可以继续通过调用相应的方法来获取你想要的数据。
01
Datastore ds = ...
02
Query q = ds.createQuery(MyEntity.
class
).filter(
"foo >"
,
12
);
03
04
//single entity
05
MyEntity e = q.get();
06
07
e = q.sort(
"foo"
).get();
08
09
//for
10
for
(MyEntity e : q)
11
print(e);
12
13
//list
14
List<MyEntity> entities = q.asList();
- Mongodb 的ORM框架 Morphia 之 Query接口
- Mongodb 的ORM框架 Morphia 之 Query接口
- Mongodb 的ORM框架 Morphia 之 Query接口
- (转)Mongodb 的ORM框架 Morphia 之 Query接口
- Mongodb 的ORM框架 Morphia 之 Datasotre接口
- Mongodb 的ORM框架 Morphia 之 接口编程
- Mongodb 的ORM框架 Morphia 之 Updating
- Mongodb 的ORM框架 Morphia 之 Updating
- Mongodb 的ORM框架 Morphia 之 使用Morphia(映射对象)
- Mongodb 的ORM框架 Morphia 之 使用Morphia(映射对象) .
- Mongodb 的ORM框架 Morphia 之 使用Morphia(映射对象)
- Mongodb 的ORM框架 Morphia 之依赖包
- Mongodb 的ORM框架 Morphia 注解 之 @Reference
- Mongodb 的ORM框架 Morphia 之 使用容器(Using Lists, Sets, and Maps)
- Mongodb 的ORM框架 Morphia 之 原始类型和基本类型注解
- 使用mongodb的orm映射框架Morphia的一些例子
- Mongodb 的ORM框架 Morphia 注解一 —— @Entity
- MongoDB程序开发之ORM工具Morphia
- Android 2.2.2到Android 4.2.2源码下载地址
- PHP数组的Hash冲突实例
- MATLAB sort函数应用——求一个矩阵前L个最大值及其在矩阵中的位置
- python Django框架的配置,以及用django搭建一个blog
- POJ - 2513 Colored Sticks
- Mongodb 的ORM框架 Morphia 之 Query接口
- Cavas绘图移动游戏背景呈现前进效果(雷电战机一)
- 工厂方法模式
- Python暴力破解的收集
- 读书笔记--盗梦工厂--2014年03月05日
- 集合中ArrayList的使用
- OpenMP学习(三)
- Android R文件无法恢复问题
- 如何熟悉一个开源项目?