MAPPER
<select id="member_by_age_gender" resultType="HashMap">
<![CDATA[
SELECT age_gd
, COUNT(*) gen_cnt
FROM (SELECT CASE
WHEN age <= 19 AND GENDER='male' THEN '00191'
WHEN age <= 19 AND GENDER='female' THEN '00192'
WHEN age >= 20 AND age < 25 AND GENDER='male' THEN '20251'
WHEN age >= 20 AND age < 25 AND GENDER='female' THEN '20252'
WHEN age >= 25 AND age < 30 AND GENDER='male' THEN '25301'
WHEN age >= 25 AND age < 30 AND GENDER='female' THEN '25302'
WHEN age >= 30 AND age < 35 AND GENDER='male' THEN '30351'
WHEN age >= 25 AND age < 30 AND GENDER='female' THEN '30352'
WHEN age >= 35 AND GENDER='male' THEN '351'
WHEN age >= 35 AND GENDER='female' THEN '352'
ELSE 'else'
END age_gd
FROM (SELECT TRUNC(MONTHS_BETWEEN(sysdate, BIRTH)/12) age, gender
FROM pjtmembers
)
)
GROUP BY age_gd
ORDER BY age_gd
]]>
</select>
위와 같이 결과가 키:값 1대1비율로 정해지는 쿼리문을 hashmap으로 리턴해서 키값으로 호출하고 싶었다.
(CDATA는 mybatis에서 부등호를 인식시키기 위함)
DAO
public List<Map<String, Object>> member_select(){
List<Map<String, Object>> maps = sqlSession.selectList("cha.member_by_age_gender");
return maps;
selectMap을 써야 키값을 지정할 수 있는듯 한데 컬럼네임이 사용자지정이라 그런지 잘 먹히지 않았다. (잘 사용되지 않는 형태인지 유용한 예문도 찾지 못함)
자구책으로 리스트맵으로 받았는데
[{AGE_GD=00191, GEN_CNT=5},
{AGE_GD=00192, GEN_CNT=4},
{AGE_GD=else, GEN_CNT=1}]
와 같은 형태이지만 키:값의 형태는 아니기에 이대로면 원하는 답이 아니다
Controller
@RequestMapping("/adminchart.do")
public String list(Model model) {
List<Map<String, Object>> list = chartdao.member_select();
HashMap<String, Object> genmap = new HashMap<String, Object>();
for (int i=0; i<list.size(); i++) {
genmap.put((String) list.get(i).get("AGE_GD"),list.get(i).get("GEN_CNT") );
}
System.out.println("hi im controller");
System.out.println(genmap);
model.addAttribute("genmap", genmap);
return "WEB-INF/views/mainjsp/adminmainchart.jsp";
}
컨트롤러에서 원시적인 방법으로 해쉬맵에 다시 넣어줬다. (혹은 collectors tomap을 사용할 수도 있을듯)
jsp에서 호출은
<c:out value="${genmap['키']}" />
방식으로 가능하다.
Mapper : 해쉬맵-> DAO : 리스트맵 -> Controller : 해쉬맵 형태의 구리구리한 코드기에 나중에 개선책을 찾아볼 것.