2011-11-25 67 views
2

我无法弄清楚如何在复杂的对象中使用mybatis结果。嵌套的mybatis地图

我有以下的映射器类:

public interface StationMapper { 
    @MapKey("stationId") 
    Map<Integer,Station> getStations(); 
} 

这是从下面的结果映射建:

<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(); 
} 

我不认为我可以使用<结果映射> <集合>元素(和我试过),因为没有实际数据的关系。

或者,我想一个StationMapper方法与此签名:

@MapKey("notUniqueId") 
Map<String,Collection<Station>> 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> 

回答

0

的MyBatis确实对应栏的一项伟大的工作,以POJO属性和做额外的工作一点点票友映射。但总的来说,我建议不要试图通过MyBatis将业务逻辑映射到映射/编组。我自己走过这条路,大部分都是从映射器中得到我需要的,但后来将它全部取消了。

因此,只需从您的映射器方法获得List<Station>,并将其转换为您需要这些东西的DAO或控制器或服务中的专用转换器方法中所需的模型。覆盖具有至少一个抽象层的映射器几乎总是更好的,它将多个更新合并到单个事务中,处理乐观锁定,隐藏内部帮助容器,高级缓存逻辑等。

一个好处是,这样的代码将更容易维护,下一个开发人员不必深入MyBatis映射的特性。此外,抓住List<Station>还可以重新用于其他用途相同的查询,它缓存合理地等

如果List<Station>需要太多资源和查询是一个关键的性能路径上,使用的MyBatis ResultHandler遍历JDBS的ResultSet 。