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

ActiveJDBC中findBySQL关联查询后getAll获取关联行为空问题

ActiveJDBC findBySQL 无法加载关联对象的问题解决

问题原因

findBySQL()是完全自定义SQL的查询方式,ActiveJDBC框架无法识别你SQL中的关联逻辑,因此include()方法不会生效——它只会配合框架自动生成的ORM查询语句,自动执行关联查询并填充cachedChildren缓存字段。这就是为什么你通过findBySQL()拿到的ClassSession调用getAll()返回空集合,而用ORM标准查询(findBySessionSerialized)能正常加载关联数据的原因。

解决方案

方案1:用ORM链式查询替代自定义SQL

优先使用ActiveJDBC的原生查询API构建关联查询,这样框架能识别关联关系,include()可以正常工作:

List<ClassSession> classSessions = ClassSession
    .find("join class_session_lesson_times csl on class_sessions.id = csl.class_session_id " +
          "join class_session_lesson_instructors csli on csl.id = csli.class_session_lesson_time_id " +
          "where csli.instructor_id = ? " +
          "order by csl.lesson_time_epochms desc", 
          user.getPersonId())
    .include(ClassSessionLessonTime.class);

// 此时getAll能正常返回关联数据
List<ClassSessionLessonTime> lts = classSessions.get(0).getAll(ClassSessionLessonTime.class);

方案2:手动触发关联加载(保留自定义SQL)

如果必须使用findBySQL(),可以在拿到ClassSession后,调用load()方法主动加载关联对象,填充缓存:

List<ClassSession> classSessions = ClassSession.findBySQL("""
        select class_sessions.*
        from class_sessions
                 join class_session_lesson_times on class_sessions.id = class_session_lesson_times.class_session_id
                 join class_session_lesson_instructors on class_session_lesson_times.id = class_session_lesson_instructors.class_session_lesson_time_id
        where class_session_lesson_instructors.instructor_id = ?
        order by class_session_lesson_times.lesson_time_epochms desc
        """, user.getPersonId());

// 主动加载关联对象
ClassSession targetSession = classSessions.get(0);
targetSession.load(ClassSessionLessonTime.class);

List<ClassSessionLessonTime> lts = targetSession.getAll(ClassSessionLessonTime.class);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:27:32