Mybatis 如何处理一对多的问题?

1.为了对一些表的原有字段进行清洗加密处理,并将结果放到新的字段中,所以把数据库表进行了抽象,表和字段是一对多的关系。
Java的PO类如下:
表实体:

public class DataCleanModel{

    /**
     * 表名
     */
    private String tableName;

    /**
     * 主键名称
     */
    private String primaryKeyName;

    /**
     * 主键值
     */
    private String primaryKeyValue;

    /**
     * 字段
     */
    private List<DataCleanColumn> columns;

    /**
     * 查询条件 (select... where ?)
     */
    private String queryCondition;

    /**
     * 修改条件 (update... where ?)
     */
    private String updateCondition;
    
}

字段实体:

public class DataCleanColumn {

    /**
     * 原始字段名
     */
    private String columnName;

    /**
     * 原始字段值
     */
    private String columnVaule;

    /**
     * 目标字段名
     */
    private String targetColumnName;

    /**
     * 目标字段值
     */
    private String targetColumnValue;

    /**
     * 处理类型:根据处理类型选择不同的处理方式
     */
    private String dealType;

    /**
     * 字段加密类型:
     */
    private String encryType;
    
}

查询时,希望传入一个表名,多个字段名,查到这张表的多个字段的值。
但是目前字段只能查询出一条记录
MyBatis的Mapper文件:

 <!-- 表映射 -->
    <resultMap id="DataCleanResult" type="com.orm.domain.DataCleanModel">
        <result property="tableName" column="tableName" jdbcType="VARCHAR"/>
        <result property="primaryKeyName" column="primaryKeyName" jdbcType="VARCHAR"/>
        <result property="primaryKeyValue" column="primaryKeyValue" jdbcType="VARCHAR"/>
        <result property="queryCondition" column="queryCondition" jdbcType="VARCHAR"/>
        <result property="updateCondition" column="updateCondition" jdbcType="VARCHAR"/>
        <collection property="columns" resultMap="DataCleanColumnResult"/>
    </resultMap>
    <resultMap id="DataCleanColumnResult" type="com.orm.domain.DataCleanColumn">
       <id property="columnName" column="columnName"/>
       <result property="columnVaule" column="columnVaule"/>
       <result property="targetColumnName" column="targetColumnName"/>
       <result property="targetColumnValue" column="targetColumnValue"/>
       <result property="dealType" column="dealType"/>
       <result property="encryType" column="encryType"/>
   </resultMap>

    <!-- 查询需要处理的数据 -->
     <select id="getData" resultMap="DataCleanResult">
         select '${tableName}' as tableName, '${primaryKeyName}' as primaryKeyName, ${primaryKeyName} as primaryKeyValue
         <if test="@Ognl@isNotEmpty(columns)">
             <foreach collection="columns" open="," close="" separator="," item="column">
                 '${column.columnName}' as columnName, ${column.columnName} as columnVaule, '${column.targetColumnName}' as targetColumnName, ${column.targetColumnName} as targetColumnVaule, '${column.dealType}' as dealType, '${column.encryType}' as encryType
             </foreach>
         </if>
         from ${tableName}
         <where>
             <if test="@Ognl@isNotEmpty(queryCondition)"> ${queryCondition} </if>
             and rownum &lt; 1000
         </where>
     </select>

实际执行SQL示例:

select 
    'XXX.T_TABLE_NAME_BACK_170907' as tableName, 'UUID' as primaryKeyName, UUID as primaryKeyValue , 
    'DIAODAN_CONTACT' as columnName, DIAODAN_CONTACT as columnVaule, 
    'RMK' as targetColumnName, '1' as dealType, '1' as encryType , 
    'ENCRY_LEG_PER_NM' as columnName, ENCRY_LEG_PER_NM as columnVaule, 
    'ENCRY_CONT_NM_CN' as targetColumnName, '2' as dealType, '1' as encryType 
from RCS.T_RCS_MEC_MONITOR_LIST_BACK_170907 
WHERE rownum < 1000

SQL执行结果:

clipboard.png
可以看到一对多的“多”,可以查到多个数据,查出来的字段名加了后缀,如:_1,_2这种。
程序执行的结果中的多也只有一条记录

clipboard.png
求各位大神帮忙看下,为什么没有映射出多条,具体是哪里的问题,需要如何修改?

阅读 2.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进