2014-04-29 1 views
0

하이버 네이트 I는 HQL이 코드를 사용하는 것과 I이 쿼리를 실행 select p,c from Person p,ContactCard c where c.fk_pid=p.id 같은 HQL 가지고 객체 어레이의 목록에서 조회 결과를 측정하고 질의 루핑함으로써차이 -

List<Person> personsWithContactCard = new ArrayList<Person>(); 
List<object[]> quryResult = new ArrayList<object[]>(); 
String qry = "select p,c from Person p,ContactCard c where c.fk_pid=p.id";    
quryResult = session.createQuery(qry).list(); 

for(object[] obj : quryResult) 
{ 
Person person = new Person(); 
person = (Person)obj[0]; 
person.setContactCard = (ContactCard)obj[1]; 
personsWithContactCard.add(person); 
person=null; 
} 

을 결과 나는 사람 목록을 채운다.

내가이 인터페이스와 내가 원하는 목록에 queryResult을 변화시킬 수 있음을 알게 대한 ResultTransformer 인터페이스를 읽은 후하지만 내가 사용하려면 코드를 변경 :

String qry = "select p,c from Person p,ContactCard c where c.fk_pid=p.id"; 

personsWithContactCard = session.createQuery(qry).setResultTransformer(new ResultTransformer() {     
@Override 
public Object transformTuple(Object[] tuple, String[] aliases) 
{ 
Person person = new Person(); 
person = (Person)obj[0]; 
person.setContactCard = (ContactCard)obj[1]; 
return person ; 
} 

@Override 
public List transformList(List collection) 
{ 
return collection; 
} 
}).list(); 

이 코드는 나에게 루핑을 가진 사람들의 목록을 제공합니다.

내 질문은 : transformTuple과 For 루프의 차이점은 무엇입니까? 둘 다 성능과 처리면에서 동일합니까? 성능에 따라 어느 것이 더 좋을까요?

transformList()의 용도는 무엇입니까?

업데이트 :

다음과 같이 내가 코드에서 하나의 작은 변화를했다 @bellabax에 의해 주어진 대답에 설명 된대로 ResultTransformer의 사용을 이해 한 후 :

personsWithContactCard = session.createQuery(qry).setResultTransformer(new ResultTransformer() {     
    @Override 
    public Object transformTuple(Object[] tuple, String[] aliases) 
    { 
    Person person = new Person(); 
    person = (Person)obj[0]; 
    person.setContactCard = (ContactCard)obj[1]; 
    return person ; 
    } 

    @Override 
    public List transformList(List collection) 
    { 
    return null; 
    } 
    }).list(); 

나는 경우 null를 반환하는 transformList() 방법을 변경 나는이 코드를 실행한다. null이된다. personsWithContactCard list. 왜 transformList() 메서드를 사용하지 않을 때 collection 메서드를 반환해야합니까? 그리고 내가 transformList()transformTuple()을 사용할 때 어떻게 사용할 것인지 결정할 수 있습니다.

답변

2
일반적으로 결과의 관점에서 차이가 없습니다

하지만 ResultTransformer 사용 :

  1. 약 변경 튜플와 미래 (휴식)을 처리 할 수있는 표준 최대 절전 방법 HQL은 처리되고 튜플이 될 것입니다 반환 방법 코드없이의 ResultTransformer에 의해 마스크
  2. 는 당신에게 장식하는 가능성이나 (예를 들어) 대표

그래서 선택은 ResultTransformer 인 줄 변경합니다.

소개 ResultTransformer.transformList() :

여기

우리는 당신이 반환되는 세트의 하나 개의 행을 조작 할 수 있습니다 대신 transformTuple에 전체

으로 쿼리 결과에 변환을 수행 할 수있는 기회를 가지고 .

편집 : ResultTransformer.transformList()의 javadoc는 위에 인용
은 매우 분명하다 :이 기능 등등, 중복을 제거 타입 변환을 적용하고 전체 목록을 수정할 수 있도록하고 ResultTransformer.transformList()의 결과가 너무 Query.list() 방법으로 전달됩니다 nulltransformList에서 반환하십시오. nulllist()에서 반환하십시오.
이것은 QueryResultTransformer이 연결된 방법입니다.

+1

'transformTuple'은 내부적으로 'For 루프'로만 작동한다는 것을 의미합니다. HQL이 처리되고 튜플이 반환되는 방식이 마스크됩니다. 그래서 나는 'ResultTransformer'로부터 많은 이익을 얻지 못할 것입니다. HQL에서 수천 (80k)의 레코드를 얻으면 'For 루프'나 'ResultTransformer'를 사용하면 큰 차이가 없다고 가정합니다. 맞습니까? – Amogh

+0

당신의 예제에 따르면, 당신은'transformTuple'에서 Hibernate 쿼리로부터 리턴 된리스트를 반복하고 있습니다. Hibernate는 객체를 캐스팅하기 위해 tuple-by-tuple (tuple-by-tuple)을 수행하여리스트에 추가합니다. 따라서 캐스팅 대신 캐스팅을 수행 할 때 결과 만 트랜스 포즈 할 수 있습니다. – Amogh

+0

@ user1372488 님이 귀하의 예제를 작성한 것과 유사합니다. 'ResultTransformer'를 작성하고 for'transformList() '를 수행하십시오. –