2012-12-19 5 views
1

최대 절전 모드에서 다음을 수행 할 수 있는지 궁금합니다.최대 절전 모드의 명명 된 쿼리 및 스프링으로 DTO의 List 특성 채우기

public class ClassDTO { 
    private String className; 
    private List<String> studentNames; 
    //getters & setters 
} 

와 SQL 쿼리가 포함 된 다음 HBM 파일 :

+----------+------------+ 
|CLASS_NAME|STUDENT_NAME| 
+----------+------------+ 
| CS106 | BILL  | 
| CS106 | GEORGE | 
| CS106 | MICHEL | 
| ELEC8 | WILL  | 
| ELEC8 | MIKE  | 
| ELEC8 | BETTY | 
+----------+------------+ 
: 우리는 다음과 같은 결과를 얻을 수 있습니다 데이터베이스에서 쿼리를 실행하면

<hibernate-mapping> 
    <class name="app.ClassDTO"> 
     <id name="className" type="java.lang.String" /> 
     <property name="studentNames" type="java.lang.List" /> 
    </class> 

    <sql-query name="classQuery"> 
     <return alias="class" class="app.ClassDTO" /> 
      select classTable.CLASS_NAME AS {class.className}, ST.STUDENT_NAME 
      from CLASS classTable 
      join STUDENT ST on ST.CLASS_ID=classTable.CLASS_ID 
      where ST.age<18 
    </sql-query> 
</hibernate-mapping> 

을 다음 DTO을 고려

우리가 최대 절전 모드에서 쿼리를 실행한다면 우리는 ClassDTO 객체 목록을 얻게된다. 다음과 같은 방법으로 객체를 초기화 할 수 있습니까?

List<ClassDTO> result = getHibernateTemplate.findByNamedQuery("classQuery").; 
resul.size(); //<-- the list size should be 2 (one entry for CS106 and another for ELEC8) 
result.get(0).getStudentNames().size(); //<-- the size should be 3 for BILL, GEORGE and MICHEL who are linked to the class CS106 

최대 절전 모드 문서를 검색했지만 아직 답변을 찾지 못했습니다. 어떤 도움도 정말 절망적입니다. 사전에 녀석들 덕분에 . 당신이 조금 더 데이터를 정상화하고 매핑을 조정할 경우

+0

은 내가 무엇을 찾고 있어요 것은 일부입니다 : 당신이처럼 표를 마칠 경우

, 당신은 정말 열심히하지 않은, 자신의 ClassDTO을 만들어야합니다 클래스별로 고유 한 이름을 선택하고 클래스 당 여러 개의 학생 이름을 사용하여 'studentLists'를 채울 작업별로 그룹을 정렬합니다. – snajahi

+0

고전적인 일대일 관계가 아닌가요? 또는 나는 무엇인가 놓치고 있냐? 웹상의 몇 가지 예 : http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example/, http://viralpatel.net/blogs/hibernate-one-to-many- xml-mapping-tutorial/등등. 나는이 예제들에서 보여지는 최대 절전 모드 맵핑이 더 좋고 더 많은 Hibernate-ish라고 생각한다. 그들은 세트로 '많은'부분을 가지고 있는데, 나는 그것이 문제가되어서는 안된다고 생각합니다. –

+0

당신이 내게 준 예제는 사실 일대 다 릴레이션 - 배송을하는 엔티티에 관한 것입니다. 내가 가지고있는 것은 DTO (지속되지 않음)입니다. 그냥 그만큼 채우고 싶습니다. 클래스와 학생 ** 엔티티 ** (내 질문에 표시되지 않음)에는 물론 관심이없는 다른 속성이 있습니다. – snajahi

답변

0

자동으로이 작업을 수행하기 위해 최대 절전 모드 얻을 수 있습니다

<class name="app.ClassDTO"> 
    <id name="className" type="java.lang.String" /> 
    <list name="studentNames" table="class_student"> 
    <key column="class_name" /> 
     <element type="string"/> 
    </list> 
</class> 

내가 인정하는 것, 존재하는 유일한 데이터 만 정말이 2 열은 후 정상화하는 경우 어리석은 것처럼 보인다. 그러나 Hibernate가 플랫 테이블 데이터를 복잡한 객체 구조로 자동 변환하는 것은 특정 규칙을 따르는 것을 필요로한다 (필자는이 특별한 경우에서 모범 사례 라기보다는 그만 둔다).

final List<Object[]> resultObjects = getSession().getNamedQuery().list(); 
public Map<String, ClassDTO> resultMap = new HashMap<>(String, ClassDTO); 
for (Object[] result : resultObjects) { 
    // find ClassDTO in map for class, or create new one 
    // add student name to class dto instance 
}