gpt4 book ai didi

scala - 为 Seq 提供 Get 实例

转载 作者:行者123 更新时间:2023-12-01 13:13:07 25 4
gpt4 key购买 nike

例如,我有一些带有一些参数的实体和两个数据库表,代表这些实体:

 entity                 param
╔════╦═════════╗ ╔═══════════╦════════╗
║ id ║ name ║ ║ entity_id ║ value ║
╠════╬═════════╣ ╠═══════════╬════════╣
║ 1 ║ "One" ║ ║ 1 ║ "aaa" ║
║ 2 ║ "Two" ║ ║ 1 ║ "bbb" ║
║ 3 ║ "Three" ║ ║ 1 ║ "ccc" ║
╚════╩═════════╝ ╚═══════════╩════════╝

和一个 Scala 模型:
case class Entity(id: Long, name: String, params: Seq[String])

我想通过 Doobie 检索这些数据,但我不能直接对 Entity 实例进行,因为 params 是一个字符串序列,而不仅仅是字符串:
val sql = sql"select e.id, e.name, p.value from entity e left join param p on e.id = p.entity_id"

sql.query[Entity].to[Seq] //Error Cannot find or construct a Read instance for type: Entity

有什么技巧可以为 Get 提供 Seq 实例?

如果没有, Doobie 提供检索此类数据的方法是什么:
  • 写入原语而不是 Entity 类型:sql.query[(Long, String, String)].to[Seq] 并将此 Seq 元组组合到 Entity 实例。
    可能不方便,因为表可能有很多列,导致复制粘贴这个长元组到每个新查询。
  • 将此原语组合到另一个案例类中:case class EntityRow(id: Long, name: String)case class ParamRow(value: String)sql.query[(EntityRow, ParamRow)].to[Seq] 并组成 Entity 实例,就像在 1. 中一样。
  • 2. ,但使用 HNil :val entity = Long :: String :: HNilval param = String :: HNilsql.query[entity ++ param].to[Seq] 并组成 Entity 实例,就像在 1. 中一样。
    我不知道这种方式有什么优点或缺点,因为 shapeless 对我来说是一个新事物。
  • 使用两个单独的查询检索数据:val entities = sql"select id, name from entity".query[EntityRow].to[Seq]val params = sql"select value from param".query[ParamRow].to[Seq]可能不像通过单个查询那样高效。
  • 还有其他方法吗?

  • 谢谢。

    最佳答案

    您的案例类 Entity 期望 params 与 id 和 name 列组合在一起作为字符串列表,
    而 sql 查询 select e.id, e.name, p.value from entity e left join param p on e.id = p.entity_id 将返回包含 id、name 和 value 的行

    joined entity
    ╔════╦═════════╦════════╗
    ║ id ║ name ║ value ║
    ╠════╬═════════╬════════╣
    ║ 1 ║ "One" ║ "aaa" ║
    ║ 1 ║ "One" ║ "bbb" ║
    ║ 1 ║ "One" ║ "ccc" ║
    ║ 2 ║ "Two" ║ ║
    ║ 3 ║ "Three" ║ ║
    ╚════╩═════════╩════════╝

    这不正是您想要的。
    为了实现这一点,我们需要像下面这样重写 sql 查询
    val entities = sql"select e.id, e.name, GROUP_CONCAT(p.value SEPARATOR ',') as params from entity e left join param p on e.id = p.entity_id group by e.id, e.name".query[Entity]  

    现在您可以轻松地将您的 sql 查询输出映射到您的案例类。

    关于scala - 为 Seq 提供 Get 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58751660/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com