我可以在 Morphia 中使用原始查询吗?
Can I use raw query with Morphia?
我有以下查询:
{ query: { "$where" : { this.userName == 'Jack123' } } }
注意:- 请勿推荐query.where()
来自文档:
您可以使用 Morphia 将您可能已经使用原始 Java API 编写的查询映射到您的对象,或者访问 Morphia 中尚不存在的功能。
例如:
DBObject query = BasicDBObjectBuilder.start()
.add("albums",
new BasicDBObject("$elemMatch",
new BasicDBObject("$and", new BasicDBObject[] {
new BasicDBObject("albumId", albumDto.getAlbumId()),
new BasicDBObject("album",
new BasicDBObject("$exists", false))})))
.get();
Artist result = datastore.createQuery(Artist.class, query).get();
希望对您有所帮助。
更新:
或者你可以试试这个:
DBCursor dbCursor = datastore.getCollection(MyClass.class).find(query);
while (dbCursor.hasNext()) {
DBObject obj = dbCursor.next();
MyClass class = morphia.fromDBObject(datastore, MyClass.class, obj);
// do stuff
}
@Marcus-roool 的第一个答案是正确的方法。你 可以 使用 fromDBObject()
尽管你不应该。由于 Java 的访问控制的历史和限制,它被公开了。但需要注意的是,该方法在 1.5.0 中已弃用(尚未发布),在 2.0.0 中将 removed/replaced。它实际上是一种为 $reasons
公开的内部方法,但从未打算在外部使用。
如果您已经有了原始字符串格式的查询,另一种选择是使用 BasicDBObject.parse()
将您的查询解析为 DBObject
,然后使用 DBObject
构建 Query
=].应该注意的是,如果这个字符串来自用户数据,你应该注意确保你没有执行任意查询,这些查询可能会获取未经授权的用户提交该查询的数据。
在 Morphia v1.3.2 中,要访问接收 DBObject 参数的 createQuery 方法,您必须将数据存储转换为 AdvancedDatastore。
赞:
Query<MyClass> myQuery = ((AdvancedDatastore) myDatastore).createQuery(MyClass.class, myDbObject);
我有以下查询:
{ query: { "$where" : { this.userName == 'Jack123' } } }
注意:- 请勿推荐query.where()
来自文档:
您可以使用 Morphia 将您可能已经使用原始 Java API 编写的查询映射到您的对象,或者访问 Morphia 中尚不存在的功能。
例如:
DBObject query = BasicDBObjectBuilder.start()
.add("albums",
new BasicDBObject("$elemMatch",
new BasicDBObject("$and", new BasicDBObject[] {
new BasicDBObject("albumId", albumDto.getAlbumId()),
new BasicDBObject("album",
new BasicDBObject("$exists", false))})))
.get();
Artist result = datastore.createQuery(Artist.class, query).get();
希望对您有所帮助。
更新:
或者你可以试试这个:
DBCursor dbCursor = datastore.getCollection(MyClass.class).find(query);
while (dbCursor.hasNext()) {
DBObject obj = dbCursor.next();
MyClass class = morphia.fromDBObject(datastore, MyClass.class, obj);
// do stuff
}
@Marcus-roool 的第一个答案是正确的方法。你 可以 使用 fromDBObject()
尽管你不应该。由于 Java 的访问控制的历史和限制,它被公开了。但需要注意的是,该方法在 1.5.0 中已弃用(尚未发布),在 2.0.0 中将 removed/replaced。它实际上是一种为 $reasons
公开的内部方法,但从未打算在外部使用。
如果您已经有了原始字符串格式的查询,另一种选择是使用 BasicDBObject.parse()
将您的查询解析为 DBObject
,然后使用 DBObject
构建 Query
=].应该注意的是,如果这个字符串来自用户数据,你应该注意确保你没有执行任意查询,这些查询可能会获取未经授权的用户提交该查询的数据。
在 Morphia v1.3.2 中,要访问接收 DBObject 参数的 createQuery 方法,您必须将数据存储转换为 AdvancedDatastore。
赞:
Query<MyClass> myQuery = ((AdvancedDatastore) myDatastore).createQuery(MyClass.class, myDbObject);