MyBatis - 一对多 - 未为映射列设置值

MyBatis - One to many - values not set for mapped column

我正在使用MyBatis访问数据库。 为此,我有以下 类:

class ClassA {
    private int id;
    private List<ClassB> list;

    // public getters and setters
}

class ClassB {
    private int id;

    // public getters and setters
}

相应的 DAO 看起来像这样:

public interface ClassADAO {

  @Select("SELECT id, name, description FROM TableA WHERE id = #{id}")
  @Results(
      @Result(property = "list", javaType = List.class, column = "id",
              many = @Many(select = "ClassBDao.getClassBForClassA")))
  ClassA getClassAById(@Param("id") long id);

}

public interface ClassBDAO {

  @Select("SELECT id, classAId FROM TableB WHERE classAId = #{id}")
  ClassB getClassBForClassA(@Param("id") long id);

}

很遗憾,ClassA 的 id 列没有填入正确的 id。 看来这是因为它被用作映射列。

有人遇到过这个问题或有解决方案吗?据我所知,即使重命名列也无济于事,因为它仍然是一个映射列,因此不会设置该值。

我认为我能够在 mybatis 代码中找到它: org.apache.ibatis.executor.resultset.DefaultResultSetHandler#applyAutomaticMappings() 仅应用未映射列的映射。

我找到了所有将来可能会遇到同样问题的解决方案。 奇怪的是,您必须将 id 列指定为附加结果(因为它是映射的):

public interface ClassADAO { 

  @Select("SELECT id, name, description FROM TableA WHERE id = #{id}") 
  @Results({@Result(property = "id", column = "id"), 
            @Result(property = "list", javaType = List.class, column = "id",
              many = @Many(select = "ClassBDao.getClassBForClassA"))}) 
  ClassA getClassAById(@Param("id") long id);

}

我最后做的是为 parent class 使用一个单独的映射器和方法,而没有 children。从映射器获得 fully-populated object 后,我进行了第二次调用以仅获取 parent class (带有 ID),然后只需将 ID 复制到fully-populated object。蛮力和尴尬 FTW!

ClassA a;    
try (SqlSession session = DBConfig.getSessionFactory().openSession()) {
    ClassAMapper mapper = session.getMapper(ClassAMapper.class);
    a = (mapper.getA(id));
    ClassA a2 = (mapper.getBaseInfo(id));
    a.setID(a2.getID());
}