Scala 如何对案例类建模,以可重用的方式反映数据库查询结果

Scala 如何对案例类建模,以可重用的方式反映数据库查询结果,scala,playframework-2.3,Scala,Playframework 2.3,我将举一个例子 假设我有三个定义如下的表: { "id": ???, "family": { "id": 1, "name": "Mammal", // Awkward "realm": { "id": 1, "name": "Animal" // Awkward } }, "name": "Cat" } (伪代码) 一个诱人的案例是 case类领域( id:Int, 名称:

我将举一个例子

假设我有三个定义如下的表:

  {
    "id": ???,
    "family": {
      "id": 1,
      "name": "Mammal", // Awkward
      "realm": {
        "id": 1,
        "name": "Animal" // Awkward
      }
    },
    "name": "Cat"
  }
(伪代码)

一个诱人的案例是

case类领域(
id:Int,
名称:String
)
案例类家庭(
id:Int,
领域:领域,
名称:String
)
案例类物种(
id:Int,
家庭:家庭,,
名称:String
)
如果我在查询数据库后将其制作成json,它将如下所示:

  {
    "id": ???,
    "family": {
      "id": 1,
      "name": "Mammal", // Awkward
      "realm": {
        "id": 1,
        "name": "Animal" // Awkward
      }
    },
    "name": "Cat"
  }
选择*
来自王国
成家
在family.realm_id=realm.id上
加入物种
关于species.family_id=family.id
而species.realm\u id=family.realm\u id
示例数据:

  [{
    "id": 1,
    "family": {
      "id": 1,
      "name": "Mammal",
      "realm": {
        "id": 1,
        "name": "Animal"
      }
    },
    "name": "Human"
  },
  {
    "id": 2,
    "family": {
      "id": 1,
      "name": "Mammal",
      "realm": {
        "id": 1,
        "name": "Animal"
      }
    },
    "name": "Cat"
  }]
好的,到目前为止。。。这是可用的,如果我需要显示按领域分组的每个物种,我会转换JsValue或javascript do过滤器等。但是当将数据发布回服务器时,这些类似乎有点笨拙。如果我想添加一个新物种,我必须发布如下内容:

  {
    "id": ???,
    "family": {
      "id": 1,
      "name": "Mammal", // Awkward
      "realm": {
        "id": 1,
        "name": "Animal" // Awkward
      }
    },
    "name": "Cat"
  }
那么我的课程应该是:

case类领域(
id:Int,
名称:选项[字符串]
)
案例类家庭(
id:Int,
领域:领域,
名称:选项[字符串]
)
案例类物种(
id:选项[Int],
家庭:家庭,,
名称:String
)
这样,我可以省略发布看起来不必要的数据,但是类定义不会反映数据库中不可为空的字段


查询是数据的投影。更像是
Table.map(函数)=>Table2
。当从数据库中提取数据时,我没有得到name字段,这并不意味着它是空的。如何处理这些问题?

处理这些问题的一种方法是使用其他数据结构表示互连,而不是让每一层都知道下一层

例如,在需要表示整个树的位置,可以使用以下方式表示:

Map[Realm, Map[Family, Seq[Species]]]
然后在某些地方,例如作为REST/JSON资源,只需
领域
,在某些地方,您可能只想使用一个物种,但需要了解层次结构中的其他两个级别


我还建议您考虑两三次让您的模型结构定义JSON结构,当您更改模型类中的任何内容时,使用JSON的代码会发生什么情况?(如果你真的想这样做,你真的需要通过一个模型结构,为什么不直接从数据库结果构建JSON并跳过一个级别的数据转换呢?

None!=空,什么问题?抱歉?@samthebest你能详细解释一下你的评论吗?没有!=null,但它们都表示在其上下文中表示的内容上表示可选字段。数据库的Null与scala中的选项相同,否?;他们的行为不同。表达式
null==null
,在scala中为true,在数据库中为false。不,
None
并不表示
null
,您不应该将它们互换为相同的意思。毕竟,
选项
实际上可以为空,但这并不意味着它的