1

我有一个包含许多嵌套类的案例类。我如何使用 Phantom DSL 建模

将所有这些都放在一个案例类中不是一种选择。

例如:

case class Car(age: Int,size: Int,door: Door)
case class Door(color:String, size:Int)

谢谢

4

3 回答 3

4

好吧,在 Cassandra 上建模时,您应该记住它不像关系数据库那样工作,并且 phantom 不是一种休眠。

建模时的一件重要事情是考虑您想要执行的查询,但让我们直奔主题。

Phantom 确实允许您使用 json 表对嵌套类进行建模。

考虑以下:

case class JsonTest(prop1: String, prop2: String)

case class JsonClass(
  id: UUID,
  name: String,
  json: JsonTest,
  jsonList: List[JsonTest],
  jsonSet: Set[JsonTest]
)

您在 JsonClass 3 列中具有 JsonTest 案例类类型。

声明字段时,您应该执行以下操作:

object json extends JsonColumn[ConcreteJsonTable, JsonClass, JsonTest](this) {
    override def fromJson(obj: String): JsonTest = {
      JsonParser.parse(obj).extract[JsonTest]
    }

    override def toJson(obj: JsonTest): String = {
      compactRender(Extraction.decompose(obj))
    }
  }

  object jsonList extends JsonListColumn[ConcreteJsonTable, JsonClass, JsonTest](this) {
    override def fromJson(obj: String): JsonTest = {
      JsonParser.parse(obj).extract[JsonTest]
    }

    override def toJson(obj: JsonTest): String = {
      compactRender(Extraction.decompose(obj))
    }
  }

  object jsonSet extends JsonSetColumn[ConcreteJsonTable, JsonClass, JsonTest](this) {
    override def fromJson(obj: String): JsonTest = {
      JsonParser.parse(obj).extract[JsonTest]
    }

    override def toJson(obj: JsonTest): String = {
      compactRender(Extraction.decompose(obj))
    }
  }

基本上,幻影所做的是将字符串 json 表示保存在字符串列中。

来源:https ://github.com/outworkers/phantom/blob/develop/phantom-dsl/src/test/scala/com/websudos/phantom/tables/JsonTable.scala

于 2016-03-02T08:19:41.810 回答
1

你不能真正做到这一点,因为它不是 Hibernate 或类似的东西。您需要使用嵌套类的 ID,如下所示:

case class Car(age: Int,size: Int, doorId: UUID)
case class Door(id: UUID, color:String, size:Int)

然后只需向案例类添加一个函数,该函数返回调用 getById 的 Door 对象。

于 2016-03-01T14:57:20.287 回答
0

试试simpledba https://github.com/doolse/simpledba 它似乎在列式数据库上定义了一个关系视图。

于 2017-05-12T08:55:33.833 回答