2008년 1월 8일 화요일

Projection 설정시 결과를 Entity로 리턴받기

Critera에서 받아온 데이타를 자동으로 POJO에 매핑시켜 봅니다.

NativeSQL이나 HQL이나 모두 데이타를 쿼리하여 가져올수 있지만 조건에 따라 복잡한 쿼리문은 Criteria 로 작성하는것이 더욱 직관적이고 이해가 쉽습니다.

하지만 단일 테이블이 아닌 연관 테이블일 경우 (*)를 이용하여 전체 필드의 값을 쿼리해 오는것은 오버헤드가 많이 걸립니다. 그래서 업무에서는 페이지에 필수로 표시시켜줄 몇가지 항목들만 쿼리문속에 Projection을 이용하여 쿼리를 하게 됩니다.

하지만 Criteria를 사용하여본 분들은 알수 있겠지만 단순히 Projection 만 세팅하게 되면 디비에서 Fetch한 데이타를 Object 배열을 통하여 리턴하게 됩니다. 사실 Projection 설정시 순서만 정확히 설정해주고 Object 배열속의 데이타를 그 순서에 따라 View에 표시시켜주면 그뿐이지만 좀 특수한 데이타 타입일 경우 (예하면 Date 타입)에는 원하는 타입으로 정확히 매핑을 시켜주지 않습니다.

하이버넷 매뉴얼을 읽어보는던중 우연히 위 문제를 해결할수 있는 절묘한 방법을 찾을수 있었습니다.

또한 Criteria의 ResultTransformer 가 PassThroughResultTransformer로 변환되므로 결과치는 우리가 원하는 결과하고 많이 차이가 날수 있습니다. 그래서 궁극적으로 c.setResultTransformer(new AliasToBeanResultTransformer()); 이 문구를 이용하여 리턴받을 List속의 인스턴스는 개개의 Entity라고 명시를 해주어야 합니다. (seResultTransformer를 이용하여 세팅을 해주지 않으면 Object[] 로 결과를 리턴하게 됩니다.)
실제 사용되는 예제코드를 첨부합니다.

  ProjectionList projList = Projections.projectionList();
  projList.add(Projections.property("i.sqEmlrcv"), "sqEmlrcv");
  projList.add(Projections.property("o.name"), "name");
  projList.add(Projections.property("i.emlRcpnt"), "emlRcpnt");
  projList.add(Projections.property("s.dtReg"), "dtReg");
  projList.add(Projections.property("i.stSendI"), "stSendI");
  projList.add(Projections.property("i.cdEmlerr"), "cdEmlerr");
  projList.add(Projections.property("i.onRcpt"), "onRcpt");
  projList.add(Projections.property("i.onReply"), "onReply");
  cri.setProjection(projList);

  cri.setResultTransformer(new AliasToBeanResultTransformer(SentMailV.class));

댓글 없음:

댓글 쓰기