하이버 네이트 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()
을 사용할 때 어떻게 사용할 것인지 결정할 수 있습니다.
'transformTuple'은 내부적으로 'For 루프'로만 작동한다는 것을 의미합니다. HQL이 처리되고 튜플이 반환되는 방식이 마스크됩니다. 그래서 나는 'ResultTransformer'로부터 많은 이익을 얻지 못할 것입니다. HQL에서 수천 (80k)의 레코드를 얻으면 'For 루프'나 'ResultTransformer'를 사용하면 큰 차이가 없다고 가정합니다. 맞습니까? – Amogh
당신의 예제에 따르면, 당신은'transformTuple'에서 Hibernate 쿼리로부터 리턴 된리스트를 반복하고 있습니다. Hibernate는 객체를 캐스팅하기 위해 tuple-by-tuple (tuple-by-tuple)을 수행하여리스트에 추가합니다. 따라서 캐스팅 대신 캐스팅을 수행 할 때 결과 만 트랜스 포즈 할 수 있습니다. – Amogh
@ user1372488 님이 귀하의 예제를 작성한 것과 유사합니다. 'ResultTransformer'를 작성하고 for'transformList() '를 수행하십시오. –