Lazyloading collection in play-salat
是否可以用Sala延迟加载集合?
例如我有一个像
这样的对象
示例1(在这种情况下,检索对象时将加载整个用户列表)
1 2 3 4 5
| case class Test (
@Key ("_id") _id : ObjectId = new ObjectId,
name : String,
users : List [User ]) {
} |
或示例2(对象加载时没有列表,但是不知道如何获取用户列表)
1 2 3 4 5
| case class Test (
@Key ("_id") _id : ObjectId = new ObjectId,
name : String ) {
@Persist val users : List [User ] = List ()
} |
如何在没有用户列表的第一个示例中加载对象?
或:如何在第二个示例中加载用户列表?
预先感谢!
这里是沙拉的作者。
Salat没有类似ORM的延迟加载功能。 @Persist注释旨在将字段保留在构造函数之外,但由于只对构造函数中的字段进行反序列化,因此可以抑制反序列化。
但是您可以在进行查询时轻松决定是否需要用户列表。
1
| case class Test (@Key ("_id") id = new ObjectId, name : String, users : List [User ] = Nil ) |
您可以将用户作为嵌入式文档持久保存在测试文档中,然后使用查询的第二个参数ref在对象中排除(0)或包括(1)字段。
1
| TestDAO.find(/* query */, MongoDBObject("users" -> 0)) |
另一种策略是将用户文档分解为一个子集合-有关更多信息,请参见https://github.com/novus/salat/wiki/ChildCollection。在此示例中,Test是"父级",User是"子级"。
这里的策略是在父DAO中进行保存时,您覆盖了save方法以使用子DAO保存用户,然后将users设置为Nil来保存父对象。
然后,默认情况下,在users设置为Nil的情况下检索Test实例。
如果要使用users检索Test,则需要向DAO中手动添加一个find方法:
找到测试文件
使用测试文档的_id字段按父ID查询用户文档-这将产生List[User]
使用grater[Test]将测试文档反序列化为Test的实例,并将其与用户列表一起复制