2011-02-16 4 views
1

불행히도 매핑되지 않은 테이블에서 튜플을 반환하기 위해 내 프로젝트의 일부분에 'native'SQL 쿼리를 사용해야합니다.SQL 쿼리에서 튜플 결과의 인덱스를 건너 뛰는 방법

나는 행 당 같은 수의 값을 반환해야하고 처리 방법으로 가서 객체로 변환해야하는 쿼리가 있습니다.

예 :

List<Object[]> list = ...; 
List<MyBean> beans = ...; 

SQLQuery qry1 = session.createSQLQuery(...); 
SQLQuery qry2 = session.createSQLQuery(...); 
SQLQuery qry3 = session.createSQLQuery(...); 

list.addAll(qry1.list()); 
list.addAll(qry2.list()); 
list.addAll(qry3.list()); 

for(Object[] tuple : list) 
{ 
    MyBean bean = new MyBean(); 
    bean.setSomething0(tuple[0]); 
    bean.setSomething1(tuple[1]); 
    bean.setSomething2(tuple[2]); 
    bean.setSomething3(tuple[3]); 
    beans.add(bean); 
} 

지금, 내 문제가 qry3는 튜플의 2 인덱스의 값을 채울 수와 관계있는 열이 없다는 것입니다,하지만 3 인덱스를 채울 않습니다. 그것은 튜플을 null 또는 "" 어떻게 든 채 웁니다 쿼리를 수정해야합니다.

나는 "select a, b, null, d" 시도하고 "select a, b, '', d" 그러나이 두 가지 예외의 원인 :

org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:56) 
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:81) 
    at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:370) 
    at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:559) 
    at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:485) 
    at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:501) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1796) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:674) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
    at org.hibernate.loader.Loader.doList(Loader.java:2213) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
    at org.hibernate.loader.Loader.list(Loader.java:2099) 
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289) 
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695) 
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142) 
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152) 

그래서 내가 어떻게이 경우 인덱스를 건너 내 쿼리를 알 수 있습니까를?

답변

3

당신이 예상되는 유형으로 캐스팅해야 할 수 있습니다

select a, b, cast(null as varchar), d 
+0

완벽한 감사. – pstanton

0

아니면, 그냥 튜플 배열의 길이를 확인하고 당신이하지 않는 매개 변수를 설정하려고하지 않습니다 ..

+0

예제가 단순화되었으므로 실제 코드에서는 옵션이 아닙니다. – pstanton

관련 문제