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());
}
我正在使用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());
}