尝试将结果集强制转换为映射类时,我收到了hibernate类的类强制转换异常…我能够查看返回的结果集中的数据…但是它以Object []的形式返回我可以将Object []设置为List …我可以正确地进行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...
对于测试,我建议您在产生类强制转换异常的语句周围放置一个try-catch子句,在catch块中设置一个断点,然后查看第i个元素实际上是哪个类。
给你的问题:
您正在使用HQL SELECT语句。使用此语句的查询返回一个列表,但是列表的元素不一定是EQP_TU的实例;它们也可以是对象数组。
SELECT
为您提供的解决方案:
使用FROM语句而不是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)。