现在的位置: 首页 > 编程语言 > 正文

详解mybatis中association和collection的column传入多个参数问题

2020年02月13日 编程语言 ⁄ 共 2382字 ⁄ 字号 评论关闭

项目中在使用association和collection实现一对一和一对多关系时需要对关系中结果集进行筛选,如果使用懒加载模式,即联合使用select标签时,主sql和关系映射里的sql是分开的,查询参数传递成为问题。

mybatis文档:

property description

column 数据库的列名或者列标签别名。与传递给resultSet.getString(columnName)的参数名称相同。注意: 在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。

<resultMap id="findCountryCityAddressMap" type="map"> <result property="country" column="country"/> <collection property="cityList" column="{cityId=city_id,adr=addressCol, dis=districtCol}" //adr作为第二个sql查询条件key,即prop1属性 ofType="map" //addressCol即为虚拟列名 javaType="java.util.List" select="selectAddressByCityId"/></resultMap><resultMap id="selectAddressByCityIdMap" type="map"> <result property="city" column="city"/> <collection property="addressList" column="city" ofType="map" javaType="java.util.List"> <result property="address" column="address"/> <result property="district" column="district"/> </collection></resultMap><select id="findCountryCityAddress" resultMap="findCountryCityAddressMap"> SELECT ct.country, ci.city_id, IFNULL(#{addressQuery},'') addressCol, //为传入查询条件,构造虚拟列,虚拟列为查询条件参数值 IFNULL(#{districtQuery},'') districtCol FROM country ct LEFT JOIN city ci ON ct.country_id = ci.country_id ORDER BY ct.country_id</select><select id="selectAddressByCityId" parameterType="java.util.Map" resultMap="selectAddressByCityIdMap"> SELECT ci.city, ads.address, ads.district FROM ( SELECT city, city_id FROM city ci WHERE ci.city_id = #{cityId} ) ci LEFT JOIN address ads ON ads.city_id = ci.city_id <where> <if test="adr!=null and adr!=''"> and ads.address RegExp #{adr} </if> <if test="dis!=null and dis!=''"> ads.district Regexp #{dis} </if> </where></select>

测试文件:

@Testpublic void findCountryCityAddressTest() throws JsonProcessingException { Map<String,Object> param = new HashMap<>(); param.put("addressQuery","1168"); List<Map<String, Object>> rs = countryManager.findCountryCityAddress(param); ObjectMapper mapper = new ObjectMapper(); ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter(); System.out.println(writer.writeValueAsString(rs));}

测试结果:

[ { "country": "Afghanistan", "cityList": [{ "city": "Kabul", "addressList": [{ "address": "1168 Najafabad Parkway", "district": "Kabol" } ] } ], "city_id": 251 }, { "country": "Algeria", "cityList": [], "city_id": 59 }]

可以看到,确实将查询条件通过column参数传入到第二个sql中,并执行成功

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: 详解mybatis中association和collection的column传入多个参数问题

以上就上有关详解mybatis中association和collection的column传入多个参数问题的相关介绍,要了解更多mybatis,column,参数,mybatis,association,collection,参数内容请登录学步园。

抱歉!评论已关闭.