如何使用Phantom Cassandra驱动程序为嵌套类建模

时间:2016-03-01 14:52:08

标签: scala cassandra phantom-dsl

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

将它全部放入一个案例类中是不可取的。

例如:

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

由于

3 个答案:

答案 0 :(得分:3)

好吧,在对Cassandra进行建模时,你应该记住它不像关系数据库那样工作,而幻像不是一种休眠。

建模时的一个重要事项是考虑您想要进行的查询,但让我们明白这一点。

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

答案 1 :(得分:1)

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

df['a'] = df['a'].astype('O')

然后只需在case类中添加一个函数,该函数返回对象调用getById的对象。

答案 2 :(得分:0)

试试simpledba https://github.com/doolse/simpledba 它似乎定义了柱状数据库的关系视图。