You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quill无法识别case class方法的编译错误问题及解决思路

在ZIO+Quill中调用实体方法查询的编译异常解决办法

问题场景

使用ZIO和Quill开发CRUD应用,域模型包含一对多关系的User和Role实体。在Quill查询上下文里调用实体的typedCode方法构建查询时,触发编译异常:

Can't find case class property: typedCode
                roleSchema.filter(r => r.typedCode == lift(roleCode)).take(1)

尝试把方法改成带Unit参数的形式(r.typedCode()),又出现新异常:

Tree 'r.typedCode()' can't be parsed to 'Ast'
                roleSchema.filter(r => r.typedCode() == lift(roleCode)).take(1)

相关代码片段:

查询代码

val dc: db.Ctx.type = db.Ctx
import dc._

def findRoleByCode(roleCode: RoleCode): Result[Option[Role]] =
    dc.run(
        roleSchema.filter(r => r.typedCode == lift(roleCode)).take(1)
    ).map(_.headOption)

实体与值类定义

// User实体
case class User(
    id: String,
    firstName: String,
    lastName: String,
    age: Int
){
    def typedId: UserId = UserId(id)
}

// Role实体
case class Role(
    code: String,
    name: String
){
    def typedCode: RoleCode = RoleCode(code)
}

// 关联类与值类
case class UserToRole(roleId: RoleCode, userId: UserId)

case class RoleCode(code: String) extends AnyVal
case class UserId(id: String) extends AnyVal

原因分析

Quill的查询宏在解析查询表达式时,只能识别case class的直接成员属性,无法处理实体类中自定义的方法(包括无参方法和带Unit参数的方法)。这是因为宏需要将Scala代码转换为对应的SQL AST,而自定义方法的逻辑无法被宏解析并映射到数据库字段操作。

可行解决方案

修改域模型,将值类直接作为User和Role的case class参数,替代原有的字符串类型参数,这样Quill就能直接识别值类对应的数据库字段,同时保持类型安全。

修改后的代码示例:

实体定义

// User实体
case class User(
    id: UserId,
    firstName: String,
    lastName: String,
    age: Int
)

// Role实体
case class Role(
    code: RoleCode,
    name: String
)

// 关联类与值类(保持不变)
case class UserToRole(roleId: RoleCode, userId: UserId)

case class RoleCode(code: String) extends AnyVal
case class UserId(id: String) extends AnyVal

修改后的查询代码

val dc: db.Ctx.type = db.Ctx
import dc._

def findRoleByCode(roleCode: RoleCode): Result[Option[Role]] =
    dc.run(
        roleSchema.filter(r => r.code == lift(roleCode)).take(1)
    ).map(_.headOption)

这样修改后,Quill可以正常解析值类参数,编译通过的同时也保留了值类带来的类型安全特性。

内容的提问来源于stack exchange,提问作者red

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:40:34