0

我目前收到此错误,但我不太明白为什么:

exception during macro expansion: java.lang.IllegalStateException: Can't tokenize a non-scalar lifting. AgentService.this.agentsByOrganization(id).id

Long在进行查询之前,我是否需要将 ID 转换为?我希望能够使用特定的 Id 类,但我是 Scala 的新手,不确定这是否可能。此外,并非所有查询都失败。例如,delete作品,即使它也被传递一个AgentId. 而该findByOrganization方法不起作用。传递的其他方法AgentId也显示与 相同的错误findByOrganization

模型:

case class AgentId(value: Long) extends AnyVal
case class OrganizationId(value: Long) extends AnyVal
case class Agent(
                  id: AgentId
                  , identifier: String
                  , organizationId: OrganizationId
                  , createdAt: LocalDateTime
                  , updatedAt: LocalDateTime
                )

服务:

class AgentService(implicit val ex: ExecutionContext, val ctx: DBContext)
  extends AgentsRepository {
  import ctx._

  def listByOrganization(id: OrganizationId): List[Agent] =
    ctx.run(agentsByOrganization(id)) // this returns the error

  def delete(agent: RichAgent): Unit = {
    ctx.run(deleteAgent(agent)) // this doesn't
  }
}

存储库:

trait AgentsRepository extends Repository {
  import ctx._

  def agentsByOrganization(id: OrganizationId) = quote { // error
    query[Agent].filter(_.organizationId == lift(id))
  }

  def agentById(id: AgentId) = quote {
    query[Agent].filter(_.id == lift(id))
  }

  def deleteAgent(agent: Agent) = quote { agentById(agent.id).delete }
}

D b

import io.getquill.{PostgresJdbcContext, SnakeCase}

package object db {
  class DBContext(config: String) extends PostgresJdbcContext(SnakeCase, config)

  trait Repository {
    val ctx: DBContext
  }
}

我见过这个类似的问题,但它似乎特定于Option. 这是一个scastie 片段

4

1 回答 1

1

不太清楚发生了什么,但现在它正在工作:

    case class AgentId(value: Long) extends AnyVal
case class Agent(
                  id: AgentId
                  , identifier: String
                  , organizationId: OrganizationId
                  , createdAt: LocalDateTime
                  , updatedAt: LocalDateTime
                )
case class RichAgent(
                  id: AgentId
                  , identifier: String
                  , organization: Organization
                )

服务

class AgentService(implicit val ex: ExecutionContext, val ctx: DBContext)
  extends AgentsRepository {
  import ctx._

  def listByOrganization(id: OrganizationId): List[Agent] =
    ctx.run(agentsByOrganization(id))

  def delete(agent: Agent): AgentId = {
    AgentId(ctx.run(deleteAgent(agent.id)))
  }
}

存储库

trait AgentsRepository extends Repository {
  import ctx._

  val agents = quote {
    query[Agent]
  }

  def agentsByOrganization(id: OrganizationId) = quote {
    agents.filter(_.organizationId == lift(id))
  }

  def agentById(id: AgentId) = quote {
    agents.filter(_.id == lift(id))
  }

  def deleteAgent(agentId: AgentId) = quote { agentById(agentId).delete }
}

D b

object db {
  class DBContext(config: String) extends PostgresJdbcContext(SnakeCase, config)

  trait Repository {
    val ctx: DBContext
  }
}
于 2018-02-02T16:02:49.237 回答