2009-11-09 168 views
3

我需要在jsp中迭代List<myClass>。這是我如何獲得清單:java.lang.Long不能轉換爲java.lang.String

(當我評論它,頁面加載就好了)。

<% 
     List<myClass> pjList = null; 
     StringBuffer ejbQuery = new StringBuffer(); 

     EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistence"); 
     EntityManager em = emf.createEntityManager(); 

     ejbQuery.append("SELECT e "); 
     ejbQuery.append("FROM myClass e "); 
     pjList = em.createQuery(ejbQuery.toString()).getResultList(); 


for(myClass pj : pjList) 
{ 
    %> 
    <br /> 
    <%= pj.getSomeField()%> 
    <br /> 
    <% 
} 
%> 

這是我在google appengine中運行時得到的錯誤。本地運行良好。

Uncaught exception from servlet 
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String 
at org.datanucleus.store.appengine.DatastoreFieldManager.fetchStringField(DatastoreFieldManager.java:188) 
at org.datanucleus.state.AbstractStateManager.replacingStringField(AbstractStateManager.java:1180) 
at ar.edu.kennedy.proveedores.entities.ProEnteEy.jdoReplaceField(ProEnteEy.java) 
at ar.edu.kennedy.proveedores.entities.ProPersonaJuridicaEy.jdoReplaceField(ProPersonaJuridicaEy.java) 
at ar.edu.kennedy.proveedores.entities.ProEnteEy.jdoReplaceFields(ProEnteEy.java) 
at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772) 
at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791) 
at org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:443) 
at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo(DatastoreQuery.java:433) 
at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo(DatastoreQuery.java:391) 
at org.datanucleus.store.appengine.query.DatastoreQuery.access$800(DatastoreQuery.java:97) 
at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply(DatastoreQuery.java:515) 
at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply(DatastoreQuery.java:507) 
at org.datanucleus.store.appengine.query.StreamingQueryResult.resolveNext(StreamingQueryResult.java:137) 
at org.datanucleus.store.appengine.query.StreamingQueryResult$1.computeNext(StreamingQueryResult.java:163) 
at org.datanucleus.store.appengine.query.AbstractIterator.tryToComputeNext(AbstractIterator.java:132) 
at org.datanucleus.store.appengine.query.AbstractIterator.hasNext(AbstractIterator.java:127) 
at org.datanucleus.store.appengine.query.StreamingQueryResult$AbstractListIterator.hasNext(StreamingQueryResult.java:229) 
at org.apache.jsp.busqueda_jsp._jspService(busqueda_jsp.java:138) 

如果我使用ListIterator並調用hasNext(),我得到相同的錯誤。幫助我瞭解發生了什麼,如何解決這個問題?

+0

請注意:在現實生活中,我的持久性提供程序是一個單例,我在一個servlet中的類中執行查詢,但我複製了相關代碼,以便您可以看到List來自哪裏。 – rec

回答

2

看起來你從「myclass」中得到的映射是錯誤的。

有一個字段標記爲「字符串」,實際上它是一個「數字」。

從StackTrace看來發生的事情是,您的值從數據庫中獲取,然後轉換爲字符串。

由於該值不是字符串,因此會發生該異常。

嘗試在您的班級中標識哪些「數字」值映射爲字符串並使其固定。一個接一個地開始工作。

+0

請注意,我沒有數據庫,只是持久的類。在這種情況下會有不匹配的情況嗎? – rec

+1

你可能沒有一個由你自己管理的數據庫,雖然我不熟悉datanucleus,但他們很有可能在內部使用它。即使他們不使用數據庫作爲持久性,他們也會對數據進行「編組」和「解組」,他們可能會使用映射來知道如何執行該操作。你的問題似乎來自於「map」 – OscarRyz

+0

是的,舊數據仍然存儲在前一個字段類型中,查詢返回了舊數據和新數據(!)。由於類成員類型的變化,刪除舊數據修復了問題。 – rec

0

我只能猜測myClass與持久層中的描述(可能是基於XML的;-))不匹配。

1

問題是,在你的類myClass有一個String類型的字段,它是由數據庫中的一個整數表示的。 DataNucleus JDO試圖將這個值轉換成一個Long,它不是一個String,因此是錯誤。您需要確保對象的數據類型與數據存儲中的數據相匹配。

+0

請注意,我沒有數據庫,只是持久化的類。在這種情況下會有不匹配的情況嗎? – rec

+0

作爲奧斯卡雷耶斯,它的底層實現似乎正在使用JDO功能。 –

-5
criteria.add(Expression.like("status", 115)); 

錯誤:java.lang.classCastException:java.lang.Integer中無法投射到java.lang.String中

這樣做:

criteria.add(Expression.like("status", new String("115"))); 
0

我創建的Web服務, java,它在我的本地計算機(Windows XP)中將fo格式化爲pdf格式。但是,在我的服務器(這是在tomcat 7)unix,它拋出了一個錯誤java.lang.ClassCastException:java.lang.Long不能轉換爲java.lang.Integer。 我正在尋找答案,最後我通過將服務器中的tomcat版本從7更改爲6來解決問題。我認爲這可能有助於他們中的一些人,他們遇到了像這樣的問題。

相關問題