public List findCatalog() {
    Query query = getEntityManager().createQuery("SELECT pc.productCatalog, p.name, p.product FROM ProductCatalog pc JOIN pc.products p");
    return query.getResultList();
}

Hola, con la consulta de mi aplicación se compila bien. Pero cuando abro la página donde se ejecuta esta consulta me sale el siguiente error:

org.apache.jasper.JasperException: java.lang.NumberFormatException: Para la cadena de entrada: «productCatalog»

La productCatalog es mi clave primaria, pero mismo sucede cuando acabo de incluir el nombre de la columna

excepción
org.apache.jasper.JasperException: java.lang.NumberFormatException: Para la cadena de entrada: «nombre»
causa raíz

java.lang.NumberFormatException: Para la cadena de entrada: «nombre»

Si no hago la combinación en mi consulta, a continuación, los resultados de la tabla 1 se imprimen bien.
Estoy desorientado por ahora donde podría ser el problema, he leído Pro JPA 2 libro oficial de java EE 6 tutorial, google mucho.
Las tablas de diseño es ManyToMany. He producto tabla, *product_catalog* mesa y la unión de la tabla *product_product_catalog. No tengo llaves extranjeras en la unión de la tabla.
He creado la entidad y de la fachada de clases con el NetBeans EclipseLink asistente.

He aquí cómo se asignan en mi ProductCatalog clase de muchos a muchos relación

@ManyToMany
    @JoinTable(name = "product_product_catalog",
    joinColumns = {
        @JoinColumn(name = "product_catalog")
    },
    inverseJoinColumns = {
        @JoinColumn(name = "product")
    })
    private Collection<Product> products;

producto y product_catalog son las claves principales de las tablas correspondientes.
Ahora no tengo idea de donde podría estar equivocado, tal vez es la asignación incorrecta? A pesar de los muchos ejemplos que he visto, tienen la misma asignación de la aplicación, sino que en sus mesas se han claves foráneas, que podría ser un problema?
Además, como me dijo que si yo no me uno a la segunda tabla, todo funciona bien.

Aquí está mi servlet con la inicialización de que el método de getServletContext().setAttribute("productCatalog", productCatalogFacade.findCatalog());

Y aquí está mi página JSP fragmento de ese

<table>
            <c:forEach var="list" items="${productCatalog}" varStatus="iter">
                <tr>
                    <td>${list.productCatalog}</td>
                    <td>${list.product}</td>
                    <td>${list.name}</td>
                </tr>
            </c:forEach>
        </table>

Y aquí está mi consulta SQL nativa lo que estoy tratando de lograr

SELECT PPC.product_product_catalog, PPC.product_catalog, PPC.product, P.name, PC.name AS  "catalog name", P.code, P.description, P.price, P.producer
FROM product_catalog PC
INNER JOIN product_product_catalog PPC ON PC.product_catalog = PPC.product_catalog
INNER JOIN product P ON P.product = PPC.product

Mi último trozo de código es la salida que glassfish produce cuando voy a la página donde se ejecuta la consulta:

WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception
java.lang.NumberFormatException: For input string: "productCatalog"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at java.lang.Integer.parseInt(Integer.java:499)
at javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:375)
at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:195)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175)
at com.sun.el.parser.AstValue.getValue(AstValue.java:116)
at com.sun.el.parser.AstValue.getValue(AstValue.java:163)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219)
at org.apache.jasper.runtime.PageContextImpl.evaluateExpression(PageContextImpl.java:1007)
at org.apache.jsp.index_jsp._jspx_meth_c_forEach_0(index_jsp.java from :206)
at org.apache.jsp.index_jsp._jspService(index_jsp.java from :137)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:406)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:483)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:373)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
  • ¿cuál es la lista de espera? qué lista estás recibiendo? De depuración.
  • Hola, me salvo product_catalog.product_catalog, producto.producto, producto.nombre, product_catalog.catalog_name, producto.código, básicamente, los resultados de 2 tablas. he incluido en mi pregunta de una consulta SQL nativa lo que estoy tratando de lograr con JPQL
InformationsquelleAutor Skyzer | 2011-02-24

5 Comentarios

  1. 8

    Cuando se ejecuta una solicitud con muchas variables en SELECT cláusula, tales como

    SELECT pc.productCatalog, p.name, p.product ...

    cada fila del resultado se devuelve en forma de Object[], por lo que necesita utilizar índices numéricos para acceder a sus elementos:

    <c:forEach var="list" items="${productCatalog}" varStatus="iter"><tr>
    <td>${list[0]}</td> 
    <td>${list[2]}</td>
    <td>${list[1]}</td>
    </tr></c:forEach> 
    • gracias!!! este era el problema, supongo que tengo que leer más sobre el tema
    • hace lo mismo aplica para Hashmaps?
  2. 1

    He tenido un problema similar en mi aplicación con Java EE7, JSF2.2, JPA2 y @NamedStoredProcedureQuery que @axtavt solución ayudó a resolver (+1). Yo no estaba definir el resultado de la clase correctamente y, por tanto, se devuelve un Object[] en lugar de una Lista de los términos de clase de entidad.

    Si crea una clase de entidad para gestionar los datos de tipo de retorno se puede utilizar anotaciones sobre que clase de entidad y gestionará la asignación de automágicamente:

    @NamedStoredProcedureQuery(
    name = "getJoinedSiteData",
    procedureName = "func_joined_site_data",
    resultClasses = Site.class,
    parameters = {@StoredProcedureParameter(mode = IN, name = "site_id", type = Integer.class)}
    )
    public class Site implements Serializable{
    ...
    }

    Usted puede llamar a esto, a continuación, en el controlador como:

    public List<Site> getItems(Integer siteId){
    StoredProcedureQuery query = em.createNamedStoredProcedureQuery("getJoinedSiteData");
    return query.setParameter("site_id", siteId).getResultList();
    }

    Esto a su vez permite a la unión directa con el modelo de datos como por JSF2.2 puede utilizar la interfaz de usuario estándar:repetir o h:dataTable como el de abajo.
    por ejemplo.

    <h:dataTable value="#{controller.getItems(someSiteId)}" var="item">
    <h:column>
    <f:facet name="header">
    <h:outputText value="Site Name"/>
    </f:facet>
    <h:outputText value="#{item.name}"/>
    </h:column>
    </h:dataTable>
  3. 0

    Alguna parte del código, usted está utilizando Entero.parseInt para estas columnas nombre y productCatalog,si usted tiene analizar los métodos, a Continuación, argumento que este debe ser un número. Ningún vacío o de cadena de caracteres permitidos.

    • hey, el productCatalog está declarada como de tipo Entero y el nombre es de tipo String. He puesto un punto de ruptura en mi página JSP y corrió glassfish en modo de depuración, pero ninguna de las variables apareció incluso en el NetBeans depurador
    • ¿por qué no u imprimir el valor de la variable, y ver si tiene cadena o número.
  4. 0

    No creo que el error es donde usted piensa que es.

    A mí me parece que es esta línea

     <td>${list.productCatalog}</td>

    ese es el problema.

    Parece como si Jasper (el motor de JSP) piensa que «la lista» es un array, por lo que se está tratando de tratar su expresión como si fuera «de la lista.0» o «de la lista.1»

    Que no creo que este?

    1. Se va a ejecutar la consulta antes de llegar a la JSP, por lo que si la consulta era el problema, entonces no sería llegar a un JSP excepción.
    2. El seguimiento de la pila ha at org.apache.jsp.index_jsp._jspx_meth_c_forEach_0 lo que significa que la excepción está ocurriendo dentro de un foreach
    3. La traza de la pila también ha at javax.el.ArrayELResolver.toInteger que significa que está tratando de hacer una expresión de matriz de resolución.

    Estoy bastante seguro de que si usted cambia de JSP para

    <table>
    <c:forEach var="list" items="${productCatalog}" varStatus="iter">
    <tr>
    <td>This is a row</td>
    </tr>
    </c:forEach>
    </table>

    su excepción va a desaparecer.
    Que va a demostrar que el problema es causado por intentar acceder a las propiedades de list, y entonces te necesitamos averiguar por qué Jasper piensa que list es una matriz.

Dejar respuesta

Please enter your comment!
Please enter your name here