mybatisの中でassicationとcollectionのcolumnは複数のパラメーターの問題に入ってきます。
プロジェクトでは、assicationとcollectionを使って、ペアとペアの多関係を実現する時に、関係の中の結果集を選別しなければなりません。怠け者ローディングモードを使って、つまりselectタグを共同で使う場合、主sqlと関係マップの中のsqlは別れています。
mybatis文書:
property
description
column
データベースの列名または列ラベルの別名。レスポンスセット.getStringに渡すパラメータ名と同じです。なお、コンボキーを扱う際には、column=「{prop 1=col 1,prop 2=col 2}」という文法を使用して、複数の列名をネストされたクエリ文に入力します。これはprop 1とprop 2をターゲットネスト選択文のパラメータオブジェクトに設定します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
mybatis文書:
property
description
column
データベースの列名または列ラベルの別名。レスポンスセット.getStringに渡すパラメータ名と同じです。なお、コンボキーを扱う際には、column=「{prop 1=col 1,prop 2=col 2}」という文法を使用して、複数の列名をネストされたクエリ文に入力します。これはprop 1とprop 2をターゲットネスト選択文のパラメータオブジェクトに設定します。
<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>
テストファイル:
@Test
public 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に入力し、実行に成功したことが見られます。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。