select
a.id,a.template_id,a.creator,a.create_time,b.id node_id,b.node_code, b.node_name
from sys_wf_process a
left join sys_wf_node b
on a.id=b.process_id
where a.id=#{id}
以及对应的resultMap配置。
关联的集合属性是通过collection元素来定义的,跟通过resultMap指定子查询使用的元素是一样的,只是这里不指定子查询,而是直接配置从同一个查询结果集里面进行映射。按照上面这种配置Mybatis会把结果集里面的每一行的node_id、node_code、node_name和id字段取出根据映射关系构造为一个SysWfNode对象。
然后我们也在对应的Mapper接口里面加入刚刚定义的查询方法。 public interface SysWfProcessMapper {
SysWfProcess singleSql1ToN(Integer id);
}
测试一下,看是否能正常拿到SysWfProcess关联的SysWfNode,代码如下: public class BasicTest { private SqlSessionFactory sessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory(); private SqlSession session = null;
@Before public void before() {
session = sessionFactory.openSession();
}
@After public void after() {
session.commit();
session.close();
}
@Test public void test3() {
SysWfProcessMapper mapper = session.getMapper(SysWfProcessMapper.class);
SysWfProcess process = mapper.singleSql1ToN(1);
List nodes = process.getNodes();
System.out.println(nodes);//这里可以输出获取到的SysWfNode信息
}
} 1.2 通过多拿1
通过一条SQL语句在查询一的一方时把多的一方也查出来,我们需要在查询时把所有关联的信息都查询出来,在对应的Mapper.xml文件中添加如下配置。
select
a.id,a.node_code,a.node_name,a.process_id, b.template_id,b.creator,b.create_time
from
sys_wf_node a, sys_wf_process b
where
a.process_id=b.id and a.id=#{id}
对应的测试代码如下:
@Test public void test5() {
SysWfProcessMapper mapper = session.getMapper(SysWfProcessMapper.class);
SysWfProcess process = mapper.singleSql1ToN(1);
List nodes = process.getNodes();
SysWfNode node = nodes.get(0);
System.out.println(node.getProcess());//不为null
System.out.println(process == node.getProcess());//false
} 1.4 columnPrefix
有的时候我们的查询里面可能需要多次关联同一张表,因为查询出来的不同信息都是基于同一张表的。打个比方,我们有一张部门表,其有一个字段存的是部门经理ID,有一个字段存的是副经理ID,我们需要查一个部门的信息的时候把这个部门的经理和副经理的信息一起查出来,部门经理和副经理的信息都是存在人员信息表中的。部门表的结构是t_dept(id,name,manager_id,vice_manager_id),人员表的结果是t_person(id,no,name),那么基于上面的场景,我们的查询语句大概是这样的。
SELECT
> name,
manager_id,
vice_manager_id,
b.no manager_no,
b.name manager_name,
c.no vice_manager_no,
c.name vice_manager_name
FROM
t_dept a
LEFT JOIN
t_person b ON a.manager_id = b.id
LEFT JOIN
t_person c ON a.vice_manager_id = c.id
WHERE
a.id=#{id}