We are moving from using Java Pojo's as DTO's to records with the MyBatis framework.
The following two record types are used:
public record User(Integer cprid, String inlognaam, String upn, Boolean actief, String email, Locatie locatie, Collection<RoleExtra> rolesExtra) {}
public record RoleExtra(Role role) { }
The identifier of a user is the cprid. Location and Role are simple enums.
Having the following query in myBatis:
<select id="getAllUsers" resultMap="suezUserResult">
SELECT g.inlognaam, g.cprid, g.upn, g.actief, g.email, g.locatie, grl.rol
FROM suez.gebruikers g
LEFT JOIN suez.gebruikers_rollen_link grl USING (cprid)
WHERE cprid = 107884
ORDER BY g.naam
</select>
results in the tuples:
inlognaam | cprid | upn | actief | email | locatie | rol
-----------+--------+-----------------------------+--------+-----------------------------+---------+---------
msmith | 107884 | [email protected] | t | [email protected] | AMC | ROLE_PI
msmith | 107884 | [email protected] | t | [email protected] | AMC | ROLE_PL
The resultmaps used:
<resultMap id="suezUserResult" type="amr.bi.elsalvador.domain.suez.User">
<constructor>
<arg column="cprid" javaType="java.lang.Integer"/>
<arg column="inlognaam" javaType="java.lang.String"/>
<arg column="upn" javaType="java.lang.String"/>
<arg column="actief" javaType="java.lang.Boolean"/>
<arg column="email" javaType="java.lang.String"/>
<arg column="locatie" javaType="amr.bi.elsalvador.enums.Locatie"/>
<arg javaType="java.util.Collection" resultMap="roleExtraResult" />
</constructor>
<id column="cprid"/>
</resultMap>
<resultMap type="amr.bi.elsalvador.domain.suez.RoleExtra" id="roleExtraResult">
<constructor>
<arg column="rol" javaType="amr.bi.elsalvador.enums.Role" />
</constructor>
</resultMap>
When invoking getAllUsers I get an exception:
Error instantiating class amr.bi.elsalvador.domain.suez.User with invalid types
(Integer,String,String,Boolean,String,Locatie,Collection) or values
(107884,msmith,[email protected],true,[email protected],AMC,**RoleExtra[role=Principal Investigator]**).
Cause: java.lang.IllegalArgumentException: argument type mismatch
It seems that MyBatis is trying to make two instances of User for each role ROLE_PI and ROLE_PL (hence the argument type mismatch) instead of one instance using the set of roles. What am I doing wrong?