본문 바로가기

피드백/Spring

[SPRING MVC] Mybatis에서 Hashmap리턴 해서 키값으로 호출

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 : 해쉬맵 형태의 구리구리한 코드기에 나중에 개선책을 찾아볼 것.