我们的需求是:查询一个需求Id下面对应的多个set。
使用关联查询的时候,因为要构造返回结果对象,如果因为一个返回结果对象,就要创建两个java文件的话,那么后面项目也会看起来过于臃肿。那么,今天尝试了一下使用外部类+内部类的方式,进行结果映射。
1.返回结果对象构造
/**
* @ClassName ReqVo
* @Description TODO
* @Date 2019/8/22 11:20
* @Created by sunyiwei
*/
public class ReqVo implements Serializable {
private static final long serialVersionUID = -3001162196916396442L;
private String reqId;
private SetVo setVo;
public ReqVo() {
}
@Override
public String toString() {
return "ReqVo{" +
"reqId='" + reqId + '\'' +
", setVo=" + setVo +
'}';
}
static class SetVo{
private String setId;
public SetVo() {
}
@Override
public String toString() {
return "SetVo{" +
"setId='" + setId + '\'' +
'}';
}
}
}
上面的类创建符合javaBean规范,省略了set&get方法,其中内部类使用的是静态内部类,否则会报错,如下所示:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: No constructor found in com.cheng.test.Outer$Innermatching [java.lang.Integer, java.lang.Int]
2.持久层接口定义
/**
* @ClassName SboxSetDao
* @Description TODO
* @Date 2019/7/18 9:23
* @Created by sunyiwei
*/
@Repository
public interface SboxSetDao extends MyBaseDao<SboxSet> {
ReqVo getVo(String reqId);
}
3.mapper.xml文件配置
<resultMap id="voMap" type="com.hierway.vslm.domain.stream.ReqVo">
<id property="reqId" column="req_id"/>
<collection property="setVo" ofType="com.hierway.vslm.domain.stream.ReqVo$SetVo">
<id property="setId" column="set_id"/>
</collection>
</resultMap>
<!-- ReqVo getVo(String reqId);-->
<select id="getVo" resultMap="voMap" parameterType="String">
select ss.req_id,ss.set_id from sbox_set as ss where req_id = #{reqId}
</select>
配置主要包括resultMap
的定义,以及与持久层接口方法名对应的sql元素定义。