填充集合时出现Mybatis错误

时间:2015-04-17 14:39:26

标签: mybatis

我创建了一些结果图以在某些查询中重用。映射适用于一个查询,而另一个查询失败。 我在网上搜索了关于如何在resultsMaps中使用集合并阅读一些文章,但我仍然没有找到我做错的事。

有人可以帮我吗?

地图制作者是:

<resultMap id="SetorBalancoMap" type="atacadao.model.negocio.SetorBalanco">
     <id property="codigo" column="CODIGO_SETOR_BALANCO" /> 
     <result property="descricao" column="DESCRICAO_SETOR_BALANCO" />
     <collection property="mercadoriaFilialLocaisEstoque" javaType="ArrayList" ofType="atacadao.model.negocio.MercadoriaFilialLocalEstoque" resultMap="atacadao.mapeamento.negocio.MercadoriaFilialLocalEstoqueMapper.MercadoriaFilialLocalEstoqueMap"/>
</resultMap>

<resultMap id="MercadoriaFilialLocalEstoqueMap" type="atacadao.model.negocio.MercadoriaFilialLocalEstoque">
    <id property="idMercadoriaFilial" column="RECNUM_MEFILIAL" />
    <id property="idLocalEstoque" column="CODIGO_LOCAL_ESTOQUE" />
    <id property="idSetorBalanco" column="CODIGO_SETOR_BALANCO" />
    <result property="quantidade" column="ESTOQUE_LOC" />
    <association property="mercadoriaFilial" resultMap="atacadao.mapeamento.negocio.MercadoriaFilialMapper.MercadoriaFilialMap" />  
    <association property="localEstoque" resultMap="atacadao.mapeamento.negocio.LocalEstoqueMapper.LocalEstoqueMap" />
    <association property="setorBalanco" resultMap="atacadao.mapeamento.negocio.SetorBalancoMapper.SetorBalancoMap" />
</resultMap>

@Select( "SELECT M.FILIAL, F.NOME_FILIAL, " 
    + " M.RECNUM AS RECNUM_MEFILIAL, "
    + " L.SETOR_BALANCO AS CODIGO_SETOR_BALANCO, S.DESCRICAO AS DESCRICAO_SETOR_BALANCO, " 
    + " M.MERCADORIA AS MERCADORIA, "
    + " C.RECNUM as RECNUM_MECUSTO, "
    + " NVL(C.CUSTO_ATU, 0) AS CUSTO_ATU, NVL(B.INDICE_CUSTO, 0) AS INDICE_CUSTO, "
    + " NVL(L.ESTOQUE_LOC, 0) AS ESTOQUE_LOC, E.CODIGO, E.MULTIPLICADOR_1, E.MULTIPLICADOR_2, "
    + " L.LOCAL AS CODIGO_LOCAL_ESTOQUE "
    + " FROM SAVE.MEFILIAL M "
    + " INNER JOIN SAVE.FILIAL F ON (M.FILIAL = F.CODIGO) "
    + " INNER JOIN SAVE.MELOCAL L ON (M.FILIAL = L.FILIAL AND M.MERCADORIA = L.MERCADORIA AND F.ESTOQUE_BASE = L.LOCAL) "
    + " INNER JOIN SAVE.MEEMBALA E ON (M.MERCADORIA = E.MERCADORIA AND E.CODIGO = 1) "
    + " LEFT JOIN SAVE.SETOR_BALANCO S ON (L.SETOR_BALANCO = S.CODIGO) "
    + " INNER JOIN SAVE.MEBASICO B ON (M.MERCADORIA = B.MERCADORIA) "
    + " INNER JOIN SAVE.MECUSTO C ON (F.REGIAO = C.REGIAO AND C.MERCADORIA = DECODE(B.GRUPO_CUSTO, 0, B.MERCADORIA, B.GRUPO_CUSTO) "
    + "         AND C.MG = (DECODE(B.GRUPO_CUSTO, 0, 'M', 'G'))) "
    + " WHERE M.FILIAL = #{codigoFilial} " 
    + " AND L.SETOR_BALANCO in  "
    +"                      (SELECT TOPN1.SETOR_BALANCO FROM (SELECT /*+ FIRST_ROWS(n) */ topn.*, ROWNUM rnum FROM ( "
    +"                          select distinct MEL.SETOR_BALANCO from SAVE.MELOCAL MEL " 
    +"                          WHERE MEL.FILIAL = #{codigoFilial} "
    +"                          AND #{codigoSetor,jdbcType=INTEGER} IS NULL OR (#{codigoSetor,jdbcType=INTEGER} IS NOT NULL AND MEL.SETOR_BALANCO = #{codigoSetor,jdbcType=INTEGER}) "  
    +"                          order by MEL.SETOR_BALANCO "
    + "                         ) TOPN "
    + "                         WHERE ROWNUM <= #{rows}* (#{page} -1)+ #{rows} "
    + "                     ) TOPN1 where rnum  > #{rows} * (#{page} -1)) "
    + " order by L.SETOR_BALANCO ")
@ResultMap("SetorBalancoMap")
@Options(useCache=false)
List<SetorBalanco> findSetoresBalancoByFilialESetor(@Param("codigoFilial") Integer codigoFilial, @Param("codigoSetor") Integer codigoSetor, 
        @Param("rows") Integer linhas, @Param("page") Integer pagina);

而失败的是:

@Select ("SELECT M.FILIAL as FILIAL, F.NOME_FILIAL, "  
        +" L.SETOR_BALANCO AS CODIGO_SETOR_BALANCO, "  
        +" M.MERCADORIA AS MERCADORIA, "
        +" NVL(B.INDICE_CUSTO, 0) AS INDICE_CUSTO, " 
        +" NVL(L.ESTOQUE_LOC, 0) AS ESTOQUE_LOC, " 
        +" L.LOCAL AS CODIGO_LOCAL_ESTOQUE " 
        +" FROM SAVE.MEFILIAL M  "
        +" INNER JOIN SAVE.FILIAL F  "
        +" ON (M.FILIAL = F.CODIGO)  "
        +" INNER JOIN SAVE.MELOCAL L "
        +" ON (M.FILIAL = L.FILIAL AND M.MERCADORIA = L.MERCADORIA AND "  
        +" F.ESTOQUE_BASE = L.LOCAL)  "
        +" INNER JOIN SAVE.MEBASICO B "
        +" ON (M.MERCADORIA = B.MERCADORIA)  "
        +" WHERE M.FILIAL = #{codigoFilial} "
        +" AND M.MERCADORIA = #{codigoMercadoria}")
@ResultMap("MercadoriaFilialLocalEstoqueMap")
@Options(useCache=false)
List<MercadoriaFilialLocalEstoque> findMercadoriaFilialLocalEstoque(@Param("codigoFilial") Integer codigoFilial, @Param("codigoMercadoria") Integer codigoMercadoria);

我得到的错误是:

  

GRAVE:servlet [Spring MVC Dispatcher Servlet]的Servlet.service()与路径[/ newsave]的上下文   抛出异常[请求处理失败;嵌套异常是org.mybatis.spring.MyBatisSystemException:    嵌套异常是org.apache.ibatis.reflection.ReflectionException:无法设置属性&mercadoriaFilialLocaisEstoque&#39; &#39;类atacadao.model.negocio.SetorBalanco&#39;    有价值的&#39; atacadao.model.negocio.MercadoriaFilialLocalEstoque@19b90'原因:java.lang.IllegalArgumentException:参数类型不匹配]有根本原因   java.lang.IllegalArgumentException:参数类型不匹配

域类是:

public class SetorBalanco {
    private String codigo;
    private String descricao;
    private List<MercadoriaFilialLocalEstoque> mercadoriaFilialLocaisEstoque = new ArrayList();
    ...
}

public class MercadoriaFilialLocalEstoque {
    private Integer idMercadoriaFilial;
    private Integer idLocalEstoque;
    private Integer idSetorBalanco;

    private MercadoriaFilial mercadoriaFilial;
    private LocalEstoque localEstoque;
    private SetorBalanco setorBalanco;
    ...
}

1 个答案:

答案 0 :(得分:0)

因为DESCRICAO_SETOR_BALANCORECNUM_MEFILIAL(以及LocalEstoqueMap中的列,MercadoriaFilialMap resultMaps)列中没有值,所以结果来自findMercadoriaFilialLocalEstoque。