quill - 无法标记非标量提升

quill - can't tokenize a non-scalar lifting

我目前遇到这个错误,我不太明白为什么:

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

我是否需要在进行查询之前将 ID 转换为 Long?我希望能够使用特定的 Id class,但我是 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 }
}

db

import io.getquill.{PostgresJdbcContext, SnakeCase}

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

  trait Repository {
    val ctx: DBContext
  }
}

我看过这个similar issue, but it seems specific to Option. Here's a scastie snippet

不太确定发生了什么,但现在它正在运行:

    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 }
}

db

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

  trait Repository {
    val ctx: DBContext
  }
}