2013-01-07 2 views
0

나는 매우 단순한 Groovy 클래스를 가지고 있는데, 여기서는 Hibernate 3.3.2 GA를 통한 원시 SQL 쿼리를 사용하여 Oracle 11g 데이터베이스에서 String을 선택하려고합니다. 너무 단순 해 보이지만 내가 얻는 결과에 대해 이해할 수는 없습니다. 여기에 코드입니다 :이중 반환 단일 문자에서 'string'을 선택하십시오.

출력 :

Hibernate: Select 'Hello World!' from dual 
[[H]] 

ToListResultTransformer 인쇄하려면 전체 'Hello World!' 문자열을 얻을 내 최신 시도했지만 IMO 필요하지 않을 것이다. 그러나 내가 'H'를 시도해도 항상 결과입니다.

어떻게 전체 'Hello World'문자열이 반환 될까요?

답변

1

나는이 질문을 타이핑하면서 대답을 알아 냈다. Hibernate는 결과를 문자열 대신 문자로 해석하여 'H'만 반환하는 것처럼 보입니다.

이 문제를 해결하기 위해 발견 된 방법은 select 문에 열 별칭을 추가 한 다음 addScalar(String columnAlias, Type type)을 사용하여 결과를 String으로 해석하도록 지정하는 것입니다.

다시 말하면 ResultTransformer (AliasToEntityMapResultTransformer)를 사용하여 결과에 열 이름과 내용이 포함될 수 있지만 꼭 필요한 것은 아닙니다.

왜 Hibernate가 결과를 문자열이 아닌 문자로 매핑하는지 또는 결과를 문자열로 강제하는 다른 방법 (더 쉬운 방법)을 제안하려는 경우 확장하고 싶다면 주석을 달거나 답변을 게시하십시오.

package serialize 

import org.hibernate.cfg.Configuration 
import org.hibernate.transform.AliasToEntityMapResultTransformer 
import org.hibernate.type.StringType 

class SerializeDatabaseObjects { 


    static main(args) { 

     def sessionFactory = initHibernate() 

     def session = sessionFactory.openSession() 

     def tx 
     def result 

     try { 
      tx = session.beginTransaction() 

      result = session 
       .createSQLQuery("""Select 'Hello World!' as hello from dual""") 
       .addScalar("hello", new StringType()) 
       .setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE) 
       .list() 

      tx.commit() 
     } 
     catch (Exception e) { 
      if (tx!=null){ 
       tx.rollback() 
      } 
      throw e 
     } 
     finally { 
      session.close() 
     } 


     println result 

     sessionFactory.close() 
    } 

    static initHibernate(){ 
     return new Configuration().configure().setProperty("hibernate.show_sql", "true").buildSessionFactory() 
    } 
} 

출력 :

Hibernate: Select 'Hello World!' as hello from dual 
[[hello:Hello World!]] 
여기

예상 된 결과를 생성하는 코드
관련 문제