Java 嵌套mybatis图

Java 嵌套mybatis图,java,mybatis,Java,Mybatis,我不知道如何在复杂对象中使用mybatis结果 我有以下映射器类: public interface StationMapper { @MapKey("stationId") Map<Integer,Station> getStations(); } 公共接口站apper{ @MapKey(“stationId”) 地图站(); } 它是根据以下结果映射生成的: <resultMap id="stationMap" type="Station"> &

我不知道如何在复杂对象中使用mybatis结果

我有以下映射器类:

public interface StationMapper {
   @MapKey("stationId")
   Map<Integer,Station> getStations();
}
公共接口站apper{
@MapKey(“stationId”)
地图站();
}
它是根据以下结果映射生成的:

<resultMap id="stationMap" type="Station">
   <result column="station_id" property="stationId" />
   <result column="another_id" property="notUniqueId" />
   <result column="name" property="name" />
</resultMap>

我希望getStations()的返回类型不是映射,而是一个对象,它将映射(或集合)作为构造函数,这样我就可以在对象构造上执行一些代码

public class FancyStationMapHolder {
   public FancyStationMapHolder(Map<Integer,Station> stations) {
      executeSpecialCode(stations);
   }
   // OR
   public FancyStationMapHolder(Collection<Station> stations) {
      executeSpecialCode(stations);
   }
}
public interface StationMapper {
   FancyStationMapHolder getStations();
}
公共类FancyStationMapHolder{
公共FancyStationMapHolder(地图站){
执行特殊代码(站);
}
//或
公共FancyStationMapHolder(采集站){
执行特殊代码(站);
}
}
公共接口站apper{
FancyStationMapHolder getStations();
}
我认为我不能使用元素(我已经尝试过),因为没有实际的数据关系

或者,我想要一个带有此签名的StationMapper方法:

@MapKey("notUniqueId")
Map<String,Collection<Station>> getStationsByNotUniqueId();
@MapKey(“notUniqueId”)
Map getStationsByNotUniqueId();
编辑: 如果我基于某个列限制这个复杂的对象并设置属性而不是使用构造函数,那么我可以得到这个复杂的对象,但是如果没有关系限制,我怎么做呢

<resultMap id="fancyMap" type="sample.FancyStationMapHolder">
  <result column="someId" property="someId"/>
  <collection property="stations" column="someId" resultMap="stationMap"
   select="stations" javaType="ArrayList" />
</resultMap>

我更喜欢使用构造器,所以我也很感激你的建议。以下设置导致此异常:

 org.mybatis.spring.MyBatisSystemException:
 nested exception is org.apache.ibatis.reflection.ReflectionException:
 Error instantiating class sample.FancyStationMapHolder with invalid types
     (ArrayList,) or values ([...

<resultMap id="fancyMap" type="sample.FancyStationMapHolder">
  <constructor>
    <arg column="someId" resultMap="stationMap" select="stations"
         javaType="ArrayList" />
  </constructor>
  <result column="someId" property="someId"/>
</resultMap>
org.mybatis.spring.MyBatisSystemException:
嵌套异常为org.apache.ibatis.reflection.ReflectionException:
实例化具有无效类型的类sample.FancyStationMapHolder时出错
(ArrayList,)或值([。。。

MyBatis在将列映射到POJO属性方面做得很好,并为更高级的映射做了一些额外的工作。但总的来说,我建议不要试图通过MyBatis将您的业务逻辑用于映射/编组。我自己走了这条路,主要是从映射程序中获得了我需要的东西,但后来将其全部删除。

因此,只需从映射器方法中获取
列表
,并将其转换为需要这些东西的DAO或控制器或服务中的私有转换器方法中所需的模型。几乎总是最好使用至少一个抽象层来覆盖映射器,该抽象层将多个更新组合到单个事务中,处理这些事务锁定、隐藏内部助手容器、高级缓存逻辑等

一个好处是,这样的代码更易于维护,下一个开发人员不必深入研究MyBatis映射的特性。此外,抓取
List
还允许将同一查询重新用于其他目的,合理地缓存它等

如果
List
占用了太多资源,并且查询处于关键性能路径上,请使用MyBatis ResultHandler迭代JDBS ResultSet