2012-11-24 80 views
-1

我做了這個查詢:奇怪的實體管理器錯誤

Usuario user1=(Usuario) request.getSession().getAttribute("user"); 
String query1 = "SELECT f FROM Favorito f WHERE f.usuarioBean = 'user1'"; 

我打電話這裏的管理方法

List<Favorito> favoritos = managerFavorito.getFavoritoByUser(query1); 

和經理的方法是這樣的:

public List<Favorito> getFavoritoByUser(String query1) { 
     EntityManager em = getEntityManager(); 
     List<Favorito> results = null; 
     try { 
      Query query = em.createNativeQuery(query1); 
      results = (List<Favorito>) query.getResultList(); 
     } finally { 
      em.close(); 
     } 
     return results; 
    } 

的錯誤:

org.apache.openjpa.persistence.ArgumentException: Metadata not found for type "class java.lang.String". Class not improved. 

完整的錯誤:

[25/11/12 0:17:37:538 CET] 0000002b servlet  E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: Se ha creado una excepción no detectada en uno de los métodos de servicio del servlet servletControl en la aplicación MotorSalesGR83.15. Excepción creada: <openjpa-2.0.2-SNAPSHOT-r422266:1032678 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: No se han encontrado metadatos para el tipo "class java.lang.String". La clase no se ha mejorado. 
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:377) 
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:358) 
    at org.apache.openjpa.jdbc.meta.MappingRepository.getMapping(MappingRepository.java:355) 
    at org.apache.openjpa.jdbc.meta.strats.RelationStrategies.toDataStoreValue(RelationStrategies.java:88) 
    at org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.toDataStoreValue(RelationFieldStrategy.java:836) 
    at org.apache.openjpa.jdbc.meta.FieldMapping.toDataStoreValue(FieldMapping.java:938) 
    at org.apache.openjpa.jdbc.kernel.exps.PCPath.toDataStoreValue(PCPath.java:844) 
    at org.apache.openjpa.jdbc.kernel.exps.Lit.calculateValue(Lit.java:109) 
    at org.apache.openjpa.jdbc.kernel.exps.CompareEqualExpression.appendTo(CompareEqualExpression.java:98) 
    at org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.buildWhere(SelectConstructor.java:298) 
    at org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.evaluate(SelectConstructor.java:93) 
    at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.createWhereSelects(JDBCStoreQuery.java:349) 
    at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeQuery(JDBCStoreQuery.java:187) 
    at org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeQuery(ExpressionStoreQuery.java:776) 
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1003) 
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:861) 
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:792) 
    at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542) 
    at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:288) 
    at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302) 
    at entities.controller.FavoritoManager.getVehiculoFavorito(FavoritoManager.java:172) 
    at tiw.servletControl.doPost(servletControl.java:78) 
    at tiw.servletControl.doGet(servletControl.java:38) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:718) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179) 
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3933) 
    at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:276) 
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:931) 
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583) 
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305) 
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83) 
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) 
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) 
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604) 

有事嗎?我開始認爲我無法在一個簡單的Where中搜索Favorito中的行。

+0

請發佈完整的stacktrace並告訴我們你在哪裏得到這個異常 –

+1

堆棧跟蹤表示異常是由'entities.controller.FavoritoManager.getVehiculoFavorito(FavoritoManager.java:172)'引發的,而不是由上述方法引發的。 –

回答

1

在你的代碼中有一些奇怪的事情發生。

首先,您將user1對象拉出會話,但從不使用它。此外,在您的查詢,你聲稱f.usuarioBean等於字符串「用戶1」,我會想象永遠是真實的:

String query1 = "SELECT f FROM Favorito f WHERE f.usuarioBean = 'user1'"; 

我想你的意思是做這樣的事情:

String query1 = "SELECT f FROM Favorito f WHERE f.usuarioBean = '" + user1.getId() + "'"; 

一個更好的方法來做到這一點(說真的,要做到這一點的唯一正確途徑),是使用的查詢參數:

String query1 = "SELECT f FROM Favorito f WHERE f.usuarioBean = ?"; 
// and then later: 
query.setParameter(1, user1); 

其次,你打電話createNativeQuery,它將SQL查詢字符串作爲參數。但是,您傳遞的字符串不是SQL,而是JPQL(您不能在SQL中選擇表別名,可以嗎?)。您應該撥打createQuery,或更好的是,過載createQuery(String, Class)(創建TypedQuery),以獲得更好的類型安全性。