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
相关产品推荐
相关产品推荐

