Mybatis文档里的关联查询是这样的:
@Results(id = "requirementResult", value = {@Result(column="uuid",property="uuid", id = true),@Result(column="uuid",property="bids", many = @Many(select = "com.xxx.BidMapper.selectByRequirementUuid")),@Result(column="uuid",property="attachments", many = @Many(select = "com.xxx.RequirementAttachmentMapper.selectByRequirement")),@Result(column="name_of_requirement",property="name_of_requirement"),@Result(column="cat_of_requirement",property="cat_of_requirement"),@Result(column="statement_of_material",property="statement_of_material"),@Result(column="statement_of_processing",property="statement_of_processing"),@Result(column="estimate_price",property="estimate_price"),@Result(column="commission_type",property="commission_type"),@Result(column="commission_price",property="commission_price"),@Result(column="include_transfee",property="include_transfee"),@Result(column="reception_address",property="reception_address"),@Result(column="ton_of_requirement",property="ton_of_requirement"),@Result(column="statement_of_package",property="statement_of_package"),@Result(column="other_statement",property="other_statement"),@Result(column="create_time",property="create_time"),@Result(column="create_by",property="create_by"),@Result(column="modify_time",property="modify_time"),@Result(column="modify_by",property="modify_by"),@Result(column="is_delete",property="is_delete")})@Select("select uuid, name_of_requirement, cat_of_requirement, statement_of_material, statement_of_processing, estimate_price, commission_type, commission_price, include_transfee, reception_address, ton_of_requirement, statement_of_package, other_statement, create_time, create_by, modify_time, modify_by, is_delete" +" from ft_requirement where is_delete='N'" +" order by create_time desc")ListselectRequirements();//BidMapper里的方法@Select("select uuid,requirement_uuid,bid,statement_of_commodity,create_time,create_by,modify_time,modify_by,is_delete " + " from ft_bid where requirement_uuid=#{value} and is_delete='N'")List selectByRequirementUuid(String requirementUuid);//RequirementAttachmentMapper里的方法@Select("select uuid,requirement_uuid,file_path,create_time,create_by,is_delete from ft_requirement_attachment " + " where requirement_uuid=#{value} and is_delete='N'")List selectByRequirement(String requirementUuid);
非常简单,在执行的时候,会对每个查询方法都执行一次,例如,selectRequirements() 执行生成了2个结果,selectByRequirementUuid()执行两次,selectByRequirement执行两次,总共执行了5次查询。
这个例子中,关联查询都是只有一个参数,所以很简单。如果关联查询要传入多个参数怎么办?看下面的例子:
@Results(id = "requirementResult", value = {@Result(column="uuid",property="uuid", id = true),@Result(column="uuid",property="bids", many = @Many(select = "com.xxx.BidMapper.selectByRequirementUuid")),@Result(column="requirement=uuid, creator=myUuid",property="attachments", many = @Many(select = "com.xxx.RequirementAttachmentMapper.selectByRequirementAndCreator")),@Result(column="name_of_requirement",property="name_of_requirement"),@Result(column="cat_of_requirement",property="cat_of_requirement"),@Result(column="statement_of_material",property="statement_of_material"),@Result(column="statement_of_processing",property="statement_of_processing"),@Result(column="estimate_price",property="estimate_price"),@Result(column="commission_type",property="commission_type"),@Result(column="commission_price",property="commission_price"),@Result(column="include_transfee",property="include_transfee"),@Result(column="reception_address",property="reception_address"),@Result(column="ton_of_requirement",property="ton_of_requirement"),@Result(column="statement_of_package",property="statement_of_package"),@Result(column="other_statement",property="other_statement"),@Result(column="create_time",property="create_time"),@Result(column="create_by",property="create_by"),@Result(column="modify_time",property="modify_time"),@Result(column="modify_by",property="modify_by"),@Result(column="is_delete",property="is_delete")})@Select("select uuid, #{myUuid} as myUuid, name_of_requirement, cat_of_requirement, statement_of_material, statement_of_processing, estimate_price, commission_type, commission_price, include_transfee, reception_address, ton_of_requirement, statement_of_package, other_statement, create_time, create_by, modify_time, modify_by, is_delete" +" from ft_requirement where is_delete='N' and uuid=#{requirementUuid} " +" order by create_time desc")RequirementObj selectRequirement(@Param("requirement") String requirementUuid, @Param("myUuid") String myUuid);//BidMapper里的方法@Select("select uuid,requirement_uuid,bid,statement_of_commodity,create_time,create_by,modify_time,modify_by,is_delete " + " from ft_bid where requirement_uuid=#{value} and is_delete='N'")ListselectByRequirementUuid(String requirementUuid);//RequirementAttachmentMapper里的方法@Select("select uuid,requirement_uuid,file_path,create_time,create_by,is_delete from ft_requirement_attachment " + " where requirement_uuid=#{requirement} and create_by=#{creator} and is_delete='N'")List selectByRequirementAndCreator(@Param("requirement") String requirementUuid, @Param("creator") String creator);
这里要注意的几个点:
- 子查询使用的参数,只能从父查询的结果集中取
- 要传入联合查询的参数,在column中声明:
column="requirement=uuid, creator=myUuid"
- 子查询要使用调用方传入的参数,需要将调用方传入的参数放入到父查询的结果集中:
select uuid, #{myUuid} as myUuid, name_of_requirement ....
仅此而已