2016-01-29 17 views
7

私はhibernateとjavaを初めて使用しています。私はネイティブのSQLクエリを実行しようとしているが、私は立ち往生している。誰でも私を助けたり、私がどこでミスをしているかを確認できますか?例外の取得JDBCタイプのダイアレクトマッピング

私のJavaコードはです:

try { 
      trns = session.beginTransaction(); 
      String sql = "select principle,interest from salaryinfo where empid = " + selectedempid + ""; 
      SQLQuery query = session.createSQLQuery(sql); 
      List<Object[]> rows = query.list(); 
      for (Object[] row : rows) { 
       Salaryinfo si= new Salaryinfo(); 
       si.setPrinciple(Float.parseFloat(row[0].toString())); 
       si.setInterest(Float.parseFloat(row[1].toString())); 
       sis.add(si); 
      } 

エラートレース:私は私のプログラムをデバッグし、私のプログラムが破壊されていなかった

Severe: org.hibernate.MappingException: No Dialect mapping for JDBC type: 7 
    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:192) 
    at org.hibernate.loader.custom.CustomLoader.getHibernateType(CustomLoader.java:161) 
    at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:131) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1678) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:662) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224) 
    at org.hibernate.loader.Loader.doList(Loader.java:2145) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029) 
    at org.hibernate.loader.Loader.list(Loader.java:2024) 
    . 
    . 
    . 
    . 

このライン上にあるSQLQuery query = session.createSQLQuery(sql);

Hibernate設定ファイル:

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.password">****</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/empdata</property> 
     <property name="hibernate.connection.username">****</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> 

     <property name="hibernate.show_sql">false</property> 
    <property name="hibernate.format_sql">false</property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.c3p0.acquire_increment">1</property> 
    <property name="hibernate.c3p0.idle_test_period">10</property> <!-- seconds -->    
     <mapping resource="hibernate/Salaryinfo.hbm.xml" /> 

    </session-factory> 
</hibernate-configuration> 
+0

使用しているデータベースとHibernateの方言? '7'は' java.sql.Types.REAL'です。 –

+0

あなたはaddScaler Typeを設定していませんでした.... SQLQuery query = session.createSQLQuery(sql).addScalar( "principle"、新しいFloatType()) .addScalar( "interest"、新しいFloatType()); –

+0

あなたの休止状態を表示する – Jens

答えて

8

ネイティブのsqlquery構文にaddScalar();を入れる必要があります。 ResultSetMetadataを使用するオーバーヘッドを避けるために、または返される内容をより明確にするために、addScalar()を使用できます。このよう

SQLQuery query = session.createSQLQuery(sql) 
    .addScalar("principle", new FloatType()) 
    .addScalar("interest", new FloatType()); 
1

データベースではREALのデータ型が使用されていますが、あなたの方言はそれを理解していないため、Javaのいずれかの型にマップできません。 Types.javaを参照してください。

関連する問題