【问题标题】:Hibernate : Strange TypeCast Exception Thrown While retrieving records in Java from postgres database tableHibernate:从postgres数据库表中检索Java记录时抛出奇怪的TypeCast异常
【发布时间】:2012-07-18 09:27:27
【问题描述】:

我面临一个奇怪的类型转换错误(编译时错误) 一旦我从旅程表中检索数据,它就会抛出以下异常,因为它无法识别从列表中获取的对象。

我不知道为什么会这样抱怨,因为对象已经是旅程类型,我用“旅程”类型制作了一个模板化列表,每个记录都应该是旅程。

"INFO: HHH000397: Using ASTQueryTranslatorFactory
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to de.db.journeyTracker.model.journey
"

代码:

            public static void findalljourney(Session session )
    {

        String qryAllJourney = "SELECT j.id , j.operatingday, j.linename,  j.scheduledeparture, j.scheduledeparturestopname FROM journey j";

        Query query = session.createQuery(qryAllJourney);

        List<journey> allJourney;
        allJourney = query.list();                      

        for (int i = 0; i < allJourney.size(); i++) 
        {  

            String JourneyId =   allJourney.get(i).getJourneyid().toString(); /// TypeCast Exception Occured...
        }  

以下是旅程的模型类。

    public class journey 
{               
      int id ;
      String journeyid ;
      String linename ;
      Date operatingday ;
      Date realtimearrival;
      String  realtimearrivalstopname;
      String realtimearrivalstopnumber ;
      Date realtimedeparture ;
      String realtimedeparturestopname ;
      String realtimedeparturestopnumber;
      Date schedulearrival ;
      String schedulearrivalstopname ;
      String schedulearrivalstopnumber ;
      Date scheduledeparture ;
      String scheduledeparturestopname ;
      String  scheduledeparturestopnumber ;
      int arrivaldelay ;
      String direction ;
      String journeyoperator ;
      String schedulevehicletype ;
      String  vehicleid ;
      Double  distancerealtime;
      int  maximumspeedrealtime ;
      Boolean calledatallstops ;
      int departuredelay ;
      int maximumdelay; 
      int minimumdelay ;
      String phonenumber ;
      int comment_id ;
      Boolean arrivaldelayprojection ;
      Boolean  departuredelayprojection;
      Boolean maximumdelayprojection ;
      Boolean  maximumspeedrealtimedataincomplete;
      Boolean  minmaxdelaydataincomplete ;
      Boolean minimumdelayprojection ;
      Boolean realtimearrivalprojection ;
      Boolean  realtimedepartureprojection ;
       }

以下是上面旅程模型对应的hibernate配置文件

<?xml version="1.0"?>
<hibernate-mapping>
    <class name="de.db.journeyTracker.model.journey" table="JOURNEY">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="journeyid" type="java.lang.String">
            <column name="JOURNEYID" />
        </property>
        <property name="linename" type="java.lang.String">
            <column name="LINENAME" />
        </property>
        <property name="operatingday" type="java.util.Date">
            <column name="OPERATINGDAY" />
        </property>
        <property name="realtimearrival" type="java.util.Date">
            <column name="REALTIMEARRIVAL" />
        </property>
        <property name="realtimearrivalstopname" type="java.lang.String">
            <column name="REALTIMEARRIVALSTOPNAME" />
        </property>
        <property name="realtimearrivalstopnumber" type="java.lang.String">
            <column name="REALTIMEARRIVALSTOPNUMBER" />
        </property>
        <property name="realtimedeparture" type="java.util.Date">
            <column name="REALTIMEDEPARTURE" />
        </property>
        <property name="realtimedeparturestopname" type="java.lang.String">
            <column name="REALTIMEDEPARTURESTOPNAME" />
        </property>
        <property name="realtimedeparturestopnumber" type="java.lang.String">
            <column name="REALTIMEDEPARTURESTOPNUMBER" />
        </property>
        <property name="schedulearrival" type="java.util.Date">
            <column name="SCHEDULEARRIVAL" />
        </property>
        <property name="schedulearrivalstopname" type="java.lang.String">
            <column name="SCHEDULEARRIVALSTOPNAME" />
        </property>
        <property name="schedulearrivalstopnumber" type="java.lang.String">
            <column name="SCHEDULEARRIVALSTOPNUMBER" />
        </property>
        <property name="scheduledeparture" type="java.util.Date">
            <column name="SCHEDULEDEPARTURE" />
        </property>
        <property name="scheduledeparturestopname" type="java.lang.String">
            <column name="SCHEDULEDEPARTURESTOPNAME" />
        </property>
        <property name="scheduledeparturestopnumber" type="java.lang.String">
            <column name="SCHEDULEDEPARTURESTOPNUMBER" />
        </property>
        <property name="arrivaldelay" type="int">
            <column name="ARRIVALDELAY" />
        </property>
        <property name="direction" type="java.lang.String">
            <column name="DIRECTION" />
        </property>
        <property name="journeyoperator" type="java.lang.String">
            <column name="JOURNEYOPERATOR" />
        </property>
        <property name="schedulevehicletype" type="java.lang.String">
            <column name="SCHEDULEVEHICLETYPE" />
        </property>
        <property name="vehicleid" type="java.lang.String">
            <column name="VEHICLEID" />
        </property>
        <property name="distancerealtime" type="java.lang.Double">
            <column name="DISTANCEREALTIME" />
        </property>
        <property name="maximumspeedrealtime" type="int">
            <column name="MAXIMUMSPEEDREALTIME" />
        </property>
        <property name="calledatallstops" type="java.lang.Boolean">
            <column name="CALLEDATALLSTOPS" />
        </property>
        <property name="departuredelay" type="int">
            <column name="DEPARTUREDELAY" />
        </property>
        <property name="maximumdelay" type="int">
            <column name="MAXIMUMDELAY" />
        </property>
        <property name="minimumdelay" type="int">
            <column name="MINIMUMDELAY" />
        </property>
        <property name="phonenumber" type="java.lang.String">
            <column name="PHONENUMBER" />
        </property>
        <property name="comment_id" type="int">
            <column name="COMMENT_ID" />
        </property>
        <property name="arrivaldelayprojection" type="java.lang.Boolean">
            <column name="ARRIVALDELAYPROJECTION" />
        </property>
        <property name="departuredelayprojection" type="java.lang.Boolean">
            <column name="DEPARTUREDELAYPROJECTION" />
        </property>
        <property name="maximumdelayprojection" type="java.lang.Boolean">
            <column name="MAXIMUMDELAYPROJECTION" />
        </property>
        <property name="maximumspeedrealtimedataincomplete" type="java.lang.Boolean">
            <column name="MAXIMUMSPEEDREALTIMEDATAINCOMPLETE" />
          </property>
          <property name="minmaxdelaydataincomplete" type="java.lang.Boolean">
              <column name="MINMAXDELAYDATAINCOMPLETE" />
          </property>
          <property name="minimumdelayprojection" type="java.lang.Boolean">
              <column name="MINIMUMDELAYPROJECTION" />
          </property>
          <property name="realtimearrivalprojection" type="java.lang.Boolean">
              <column name="REALTIMEARRIVALPROJECTION" />
          </property>
          <property name="realtimedepartureprojection" type="java.lang.Boolean">
              <column name="REALTIMEDEPARTUREPROJECTION" />
            </property>
         </class>
    </hibernate-mapping>

以下是主要的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-
configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory >
  <!-- Database connection settings -->
  <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/newTestDB</property>
  <property name="connection.driver_class">org.postgresql.Driver</property>
  <property name="connection.username">postgres</property>
  <property name="connection.password">usman123</property>
  <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
  <!-- SQL dialect - generate SQL for a particular database -->
  <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
  <!-- Echo all executed SQL statements -->
  <property name="show_sql">false</property>
  <!-- Automatic schema creation (begin) === 
<property name="hibernate.hbm2ddl.auto">create</property>  
 Enable Hibernate's automatic session context management -->
  <property name="current_session_context_class">thread</property>
  <!-- Mapping resource configuration files -->
  <mapping resource="de/db/journeyTracker/model/TestTable.hbm.xml"/>
  <mapping resource="de/db/journeyTracker/model/gpspos.hbm.xml"/>
  <mapping resource="de/db/journeyTracker/model/journey.hbm.xml"/>
  <mapping resource="de/db/journeyTracker/model/trip.hbm.xml"/>


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

编辑:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to de.db.journeyTracker.model.journey
    at de.db.journeyTracker.model.journey.findalljourney(journey.java:323)

我尝试了以下代码..正如你所建议的..但它仍然给出了异常

           List<Object[]> allJourney;
        allJourney = query.list();
        int Count = 0;
        for (Object[] Journey : allJourney)                 
        {                           

           String strJourneyId =  ((journey) Journey[0]).getJourneyid().toString();
           String strOperatingDay = ((journey) Journey[0]).getOperatingday().toString();
           String strLineName = ((journey) Journey[0]).getLinename();
           String strSchedualeDeparture = ((journey) Journey[0]).getScheduledeparture().toString();
           String strSchedualeDepartureStopName = ((journey) Journey[0]).getScheduledeparturestopname();


          System.out.println(strJourneyId + " " + strOperatingDay + " " + strLineName + " " + strSchedualeDeparture + " " + strSchedualeDepartureStopName);
        }

【问题讨论】:

  • 而不是字符串 strJourneyId = ((journey) Journey[0]).getJourneyid().toString();你已经写了 String strJourneyId = ((Integer) Journey[0]).toString();

标签: java database hibernate postgresql


【解决方案1】:

在 Hibernate 中使用 HSQL 查询 试试这种类型的查询

1>String qryAllJourney = "来自旅程 j"; 这将返回所有旅程表记录,没有任何类型转换异常。

或者 - 假设类旅程有一个适当的构造函数 - 作为一个实际的类型安全 Java 对象: String qryAllJourney = "从旅程中选择新旅程(j.id , j.operatingday, j.linename, j.scheduledeparture, j.scheduledeparturestopname)";

如果您想了解更多详情,请点击此链接。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

【讨论】:

  • Pradeep :我不想要所有记录和全部数据。我只想从 Journey 表中检索一些特定的数据(我提到了列名)。稍后我希望将此表中的数据与其他表连接。
  • Usman :您可以从表中选择特定列作为答案中提供的第二个选项。为此,您需要做的就是为该类的构造函数提供选定的列。
【解决方案2】:

这个查询:

SELECT j.id , j.operatingday, j.linename,  
       j.scheduledeparture, j.scheduledeparturestopname 
FROM journey j

不选择旅程实例列表。相反,它选择对象数组列表。数组元素与选择列表中的值匹配:

   [0] = j.id
   [1] = j.operatingday
   ...

改用以下内容:

   SELECT j FROM journey j

但如果你想坚持使用返回的数组,请选择:

  List<Object[]>  allJourney = query.list(); 
  //do what ever you need to do with result:
  for (Object[] row: allJourney) {
      Integer id = (Integer) row[0];
      Date operatingday = (Date) row[1];
  }

【讨论】:

  • 不,但我不想要所有这些列数据。我的意思是我不想检索每条记录和所有内容。但是我想检索一些特定的列数据。更重要的是.. Journey 表有近 5K 条记录,一旦执行查询,执行 1 分钟后就会报错。像 GC 崩溃或超出限制或......不知何故其他边界问题......我不知道
  • 如果您不想选择旅程记录,那么不要期望joyrney作为结果。正如我在回答中所说,结果现在是对象数组。如果您想根据某些条件选择记录,请添加适当的 WHERE 子句。
  • 那么,在普通的psql查询中,能不能不从表中选择少量的列数据呢?就像上面的 SELECT j.id,j.schedualedeparturetime,j.arrivaltime,j.operatingday 我只想检索几列的数据而不是全部。
  • 是的,你可以(我假设你使用 psql 你指的是 HQL),这就是你正在做的,结果是对象列表 [],其中第一个元素(在你的情况下)是值 id,其次是营业日的价值,依此类推。答案中添加了有关如何从结果中选择值的示例。
  • Mikko Maunnu : 你能看看编辑吗.. 因为现在它在抱怨同样的......:-(
【解决方案3】:

这应该是一个 hsql 查询!

String qryAllJourney = "SELECT j.id , j.operatingday, j.linename, j.scheduledeparture, j.scheduledeparturestopname FROM journey j";

应该是这样的;

String qryAllJourney = "from Journey";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多