2017-08-25 4 views
0

Dans mon travail quotidien, j'ai trouvé la nécessité de mapper un SQL à son POJO. Outre les colonnes du POJO lui-même, j'avais des colonnes calculées qui devaient être cartographiées quelque part. Le mappage à de nouvelles variables dans le POJO ne semblait pas la meilleure option, car je ne savais pas vraiment combien de nouvelles colonnes j'aurais besoin (maintenant et à l'avenir).Mybatis: Mapper une partie du SQL à HashMap à l'intérieur de POJO

Exemple:

SQL: select id, name, surname, calculated_column_1, calculated_column_2, ... from person 
left outer join.... 

'calculated_column_1' et 'calculated_column_2' sont, comme leur nom dit, les colonnes calculées d'une autre table dépendent.

Je ne savais pas si j'allais avoir besoin de 1, 2 ou N colonnes calculées.

Comment peut-il être mappé sur le pojo?

+0

apprécié si vous répondez à votre propre question. pas la section de la question –

+0

Changez tout de suite. Merci –

Répondre

1

Après plusieurs essais, je trouve la solution comme suit:

POJO: 
private int id; 
private String name; 
private String surname; 
private HashMap<String, Object> aditionalColumns; 

//getters & setters 


MyBatis Mapper: 
<resultMap id="BaseResultMap" type="Person" automapping="true"> 
    <id column="id" property="id"/> 
    <association property="aditionalColumns" resultMap="aditionalColumnsMapper" columnPrefix="calculated_"/> 
</resultMap> 


<resultMap id="aditionalColumnsMapper" type="map" autoMapping="true"/> 

Dans ce cas, mon aditionalColumns HashMap ressemblerait à ceci après la cartographie

{column_1=value1, column_2=value2} 

Note: Je ne savais pas comment de nombreuses colonnes dont j'avais besoin, si vous savez exactement combien vous avez besoin, et cela ne changera pas, vous pouvez mapper seulement vos colonnes en changeant le second resultMap comme suit:

<resultMap id="aditionalColumnsMapper" type="map"> 
    <result column="calculated_column_1" property="calculated_column_1"/> 
    <result column="calculated_column_2" property="calculated_column_2"/> 
</resultMap>