2012-05-25 140 views
1

当试图将结果集转换为映射类时,我得到了一个类转换异常与休眠状态...我能够看到返回的结果集中的数据...但它来回作为一个对象[],我可以将对象[]设置为列表...我是否正确地做我的hibernate映射?我从查询,但它没有正确映射正确的数据传回...休眠类演员异常

映射

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</property> 
     <property name="hibernate.connection.url">jdbc:db2://****</property> 
     <property name="hibernate.connection.username">*****</property> 
     <property name="hibernate.connection.password">*****</property> 
     <property name="hibernate.connection.pool_size">1</property> 
     <property name="show_sql">true</property> 
     <property name="hbm2ddl.auto">NONE</property> 
     <property name="dialect">org.hibernate.dialect.DB2Dialect</property> 
     <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
     <property name="hibernate.current_session_context_class">thread</property> 
     <mapping package="db2"/> 
     <mapping class="db2.EQP_UT"/> 
     <mapping class="db2.EQP_COMP_PRIMARY"/> 
    </session-factory> 
</hibernate-configuration> 

映射

@Entity 
@Table(name = "EQP_UT") 
public class EQP_UT implements Serializable { 

    @Id 
    private String INITIAL; 

    @Id 
    private String NUMBER; 
    private Integer AXL_CNT; 
    private String EQP_TYP_CD; 
    private String EIN; 
    private Integer TRUK_CNT; 

    @OneToOne 
    @JoinTable(name = "EQP_COMP_PRIMARY", 
     joinColumns = {@JoinColumn(name = "INITIAL"), @JoinColumn(name = "NUMBER")}, 
     inverseJoinColumns = { 
      @JoinColumn(name = "INITIAL"), @JoinColumn(name="NUMBER") 
      } 
    ) 
    public EQP_COMP_PRIMARY eqp_comp; 

    public EQP_UT(){ 
     this.INITIAL = ""; 
     this.NUMBER = " "; 
     int a = this.retrieve(); 
     System.out.println("This is the data is here..." + a); 
    } 

    public String getNumber() 
    { 
     return NUMBER; 
    } 

    public void setNumber(String num) 
    { 
     this.NUMBER = num; 
    } 

    public String getInitial() 
    { 
     return INITIAL; 
    } 

    public void setInitial(String init) 
    { 
     this.INITIAL = init; 
    } 

    public int retrieve() 
    { 
     Session session = null; 
     Transaction transaction = null; 

     try{ 
      session = HibernateUtil.getDB2SessionFactory().getCurrentSession(); 
      transaction = session.beginTransaction(); 

      String init = "AARE"; 
      String number = String.format("%010d", 9350); 
      Integer num = Integer.parseInt(number); 

      String queryString = "SELECT A.INITIAL, A.NUMBER, " + 
        "A.TRUK_CNT, A.EQP_TYP_CD, A.AXL_CNT, " + 
        "B.TRUK_AXL_CNT, A.EIN FROM EQP_UT AS A " + 
        "LEFT JOIN A.eqp_comp AS B " + 
        "WHERE A.INITIAL||A.NUMBER IN (:carList) AND A.INITIAL IN (:initList) AND A.NUMBER IN (:numberList) " + 
        "AND B.TRUK_AXL_CNT > 0"; 

      Query query = session.createQuery(queryString); 
      query.setParameterList("carList", Globals.returnCarList()); 
      query.setParameterList("initList", Globals.returnCarListCarInits()); 
      query.setParameterList("numberList", Globals.returnCarListCarNumbers()); 

      @SuppressWarnings("unchecked") 
      List obj = query.list(); 

      System.err.println("CLASS NAME IS " + obj.get(0).getClass().getClass().getName()); 

      Globals.eqpList = obj; //Globals.eqpList is List<EQP_UT> 

      session.getTransaction().commit(); 

      return 10;  
     } 
     catch(HibernateException ex) 
     { 
      ex.printStackTrace(); 
      transaction.rollback(); 

     } 
     catch(Exception ex) 
     { 
      System.err.println(ex.getMessage()); 
     } 

     return -1; 
    } 
} 

注册类

@Entity 
@Table(name = "EQP_COMP_PRIMARY") 
public class EQP_COMP_PRIMARY implements Serializable{ 

     private Integer TRUK_AXL_CNT; 

     @Id 
     private String INITIAL; 
     @Id 
     private String NUMBER; 
} 

主要

//tons more code... 
for(int i = 0; i < Globals.eqpList.size(); i++) 
{ 
    EQP_UT e = Globals.eqpList.get(i); //class cast exception - and Globals.eqpList is List<EQP_UT> 
} 
//tons more code... 

回答

1

对于测试中,我建议你把一个try-catch子句在其周围产生类转换异常的语句,在catch块中设置断点并查看第i个元素究竟是哪个类。

您的问题:

您正在使用的HQL语句SELECT。使用此语句的查询返回一个列表,但列表中的元素不一定是EQP_TU的实例;他们也可以是一个对象数组。

解决方案为您提供:

使用,而不是SELECT语句FROM声明。在您的代码中:

String queryString = "FROM EQP_UT AS A " + 
       "LEFT JOIN A.eqp_comp AS B " + 
       "WHERE A.INITIAL||A.NUMBER IN (:carList) AND A.INITIAL IN (:initList) AND A.NUMBER IN (:numberList) " + 
       "AND B.TRUK_AXL_CNT > 0"; 

然后,您可以确保获得您在FROM(EQP_UT代码中)之后提到的类的实例的列表。

+0

感谢您的回复...当我改变我现在越来越无法实例化实体:db2.EQP_UT – JonH

+0

在EQP_UT的构造函数中,您调用retrieve(),它执行查询,迫使hibernate调用EQP_UT的构造函数...不能工作。 – Johanna