2016-01-29 18 views
7

Tôi mới dùng hibernate và java. Tôi đang cố gắng để thực hiện truy vấn sql bản địa nhưng tôi đã bị mắc kẹt. Bất cứ ai có thể giúp tôi hoặc kiểm tra nơi tôi đang làm sai?Nhận ngoại lệ Không có ánh xạ đối tượng cho loại JDBC

mã java của tôi là:

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); 
      } 

Lỗi vết:

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) 
    . 
    . 
    . 
    . 

tôi đã gỡ lỗi chương trình của tôi và thấy chương trình của tôi là vi phạm là trên dòng này SQLQuery query = session.createSQLQuery(sql);

Tệp cấu hình 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

Những cơ sở dữ liệu và Hibernate phương ngữ bạn đang sử dụng? Lưu ý rằng loại '7' là' java.sql.Types.REAL' –

+0

Bạn đã không đặt addScaler Type .... Hãy thử truy vấn SQLQuery = session.createSQLQuery (sql) .addScalar ("nguyên tắc", mới FloatType()) .addScalar ("sở thích", FloatType mới()); –

+0

Hiển thị cấu hình ngủ đông của bạn – Jens

Trả lời

8

Bạn cần đặt addScalar(); vào cú pháp sqlquery gốc của mình. Để tránh chi phí sử dụng ResultSetMetadata, hoặc đơn giản là rõ ràng hơn trong những gì được trả về, người ta có thể sử dụng addScalar().

Như thế này:

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

Cơ sở dữ liệu của bạn đang sử dụng REAL loại dữ liệu, nhưng phương ngữ của bạn không hiểu và do đó không thể ánh xạ nó với một trong các loại Java. Xem Types.java.

Các vấn đề liên quan