0

是否可以使用 Sala 加载一个惰性集合?

例如我有一个像

示例 1(在这种情况下,检索对象时会加载整个用户列表)

case class Test(
    @Key("_id") _id: ObjectId = new ObjectId,
    name: String,
    users: List[User]) {
}

或示例 2(对象在没有列表的情况下加载,但不知道如何获取用户列表)

case class Test(
    @Key("_id") _id: ObjectId = new ObjectId,
    name: String) {
    @Persist val users: List[User] = List()
}

如何在没有用户列表的情况下加载第一个示例中的对象?或者:如何在第二个示例中加载用户列表?

提前致谢!

4

1 回答 1

1

萨拉特作者在这里。

Salat 没有 ORM 延迟加载之类的东西。@Persist注解旨在保留构造函数之外的字段,但会抑制反序列化,因为只有构造函数中的字段会被反序列化。

但是您可以在进行查询时轻松决定是否需要用户列表。

case class Test(@Key("_id") id = new ObjectId, name: String, users: List[User] = Nil) 

您可以将用户作为嵌入文档保存在测试文档中,然后使用查询的第二个参数 ref 来排除 (0) 或包含 (1) 对象中的字段。

TestDAO.find(/* query */, MongoDBObject("users" -> 0))

另一种策略是将用户文档分解为子集合 - 有关更多信息,请参见https://github.com/novus/salat/wiki/ChildCollection。在这个例子中,Test是“父”,User是“子”。

那里的策略是,在父 DAO 中,当保存时,您覆盖保存方法以使用子 DAO 保存用户,然后将父对象users设置为保存Nil

然后,默认情况下,Test检索一个实例并将其users设置为 Nil。

如果你想用 检索Testusers你需要手动向你的 DAO 添加一个 find 方法:

  1. 找到测试文件
  2. 使用_id测试文档的字段按父 ID 查询用户文档 - 这将产生List[User]
  3. Test将测试文档反序列化为using的实例,grater[Test]并将其与用户列表一起复制
于 2013-09-23T12:50:23.517 回答