2010-09-17 21 views
10

Estoy intentando editar una tabla en Postgresql usando JPA en Glassfish usando EclipseLink. Cuando inserto una entidad, funciona bien. Pero cuando intento editar o eliminar la misma entidad, falla con el siguiente error. ¿Alguna idea?Ningún operador coincide con el nombre y los tipos de argumentos. Es posible que necesite agregar moldes de tipo explícitos. - Netbeans, Postgresql 8.4 y Glassfish

 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying 
    Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
    Position: 38 
Error Code: 0 
     at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1422) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:799) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:867) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:587) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:530) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeCall(AbstractSession.java:914) 
     at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205) 
     at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191) 
     at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteObject(DatasourceCallQueryMechanism.java:182) 
     at org.eclipse.persistence.internal.queries.StatementQueryMechanism.deleteObject(StatementQueryMechanism.java:101) 
     at org.eclipse.persistence.queries.DeleteObjectQuery.executeDatabaseQuery(DeleteObjectQuery.java:167) 
     at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:675) 
     at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:589) 
     at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:109) 
     at org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:112) 
     at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:86) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2857) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167) 
     at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:297) 
     at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:256) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1406) 
     at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:547) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1508) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3128) 
     at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:268) 
     at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157) 
     at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68) 
     at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:412) 
     ... 25 more 
Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying 
    Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
    Position: 38 
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) 
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) 
     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:321) 
     at com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:108) 
     at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:792) 
     ... 53 more 
Java Result: 1 
+0

Por favor muestre su entidad, la tabla correspondiente, tal vez su código en su caso, y el SQL generado. Ver [esta pregunta anterior] (http://stackoverflow.com/questions/2374395/is-it-possible-to-output-generated-sql-using-eclipselink-without-having-to-increa) para generar el SQL generado . –

+0

Para no piratearlo, el ORM y el software externo postgres le permiten registrar sus propios moldes y comparar operaciones. [Mire el ejemplo en una pregunta similar] (http://stackoverflow.com/questions/20773805/postgresql-enum-and-character-varying-updating/43748427#43748427). P.S. Fue la respuesta, pero se eliminó por alguna razón ... – Hubbitus

Respuesta

8

Este el principal error:

ERROR: operator does not exist: integer = character varying

código está tratando de coincidir con un número entero y una cadena, eso no va a funcionar. Arregle su código, obtenga la consulta que está involucrada para ver si lo solucionó. Ver también los archivos de registro de PostgreSQL.

Una solución (¡NO UNA SOLUCIÓN!) Es hacer algo de fundición. Check this article.

+0

¿Encontraste lo que estaba arrojando esto? – RMcNairn

11

Tuve este problema y lo resolví. Esto se debió a que la cláusula WHERE contiene un valor de cadena en lugar de un valor entero.

0

Bro, tuve el mismo problema. La cosa es que construí un generador de consultas, bastante complejo que construye sus predicados dinámicamente pendientes sobre qué parámetros se habían establecido y almacenaba en caché las consultas. De todos modos, antes de construir mi generador de consultas, tenía un código de procedimiento no orientado a objetos que construía lo mismo (excepto, por supuesto, no almacenaba consultas ni utilizaba parámetros) que funcionaba sin fallas. Ahora, cuando mi creador intentó hacer exactamente lo mismo, mi PostgreSQL arrojó este error jodido que usted también recibió. Examiné mi código SQL generado y no encontré errores. Extraño de hecho.

Mi búsqueda pronto demostró que era un predicado particular en la cláusula WHERE que causaba este error. Sin embargo, este predicado fue construido por un código que se parecía, bueno, casi a exactamente como el código de procedimiento se veía antes de que esta excepción comenzara a aparecer de la nada.

Pero vi una cosa que había hecho de manera diferente en mi constructor en comparación con lo que hacía el código de procedimiento anteriormente. ¡Era el orden de los predicados que puso en la cláusula WHERE! Así que comencé a mover este predicado y pronto descubrí que, de hecho, el orden de los predicados tenía mucho que decir. Si tuviera este predicado solo, mi consulta funcionaba (pero devolvía un resultado erróneo, por supuesto), si lo ponía con uno u otro predicado funcionaba a veces, no funcionaba otras veces. Además, imitar el orden anterior del código de procedimiento tampoco funcionaba. Lo que finalmente funcionó fue poner este predicado demoníaco al comienzo de mi cláusula WHERE, ¡como el primer predicado agregado! Entonces, de nuevo, si no me he dejado claro, el orden en que mis predicados se agregaron al método WHERE/cláusula estaba creando esta excepción.

0

Supongo que esto puede deberse a muchas cosas. En mi caso, estaba teniendo la condición "WHERE id IN" en mi consulta y estaba configurando IDs separados por guión como una cadena usando el método setString en PreparedStatement.

No estoy seguro de si hay una mejor manera de hacerlo, pero acabo de agregar marcador de posición en mi extracto y lo reemplacé por valores propios.

0

Si alguien está teniendo esta excepción y es la construcción de la consulta utilizando cadenas multilínea Scala:

Parece que hay un problema con algunos controladores de la APP en esta situación. No estoy seguro de cuál es el carácter que Scala usa para LINE END, pero cuando tiene un parámetro justo al final de la línea, el carácter LINE END parece estar adjunto al parámetro y, por lo tanto, cuando el controlador analiza la consulta, este error aparece.Una obra sencilla de evitar es dejar un espacio vacío justo después del parámetro al final:

SELECT * FROM some_table a 
WHERE a.col = ?param 
AND a.col2 = ?param2 

lo tanto, sólo asegúrese de dejar un espacio vacío después de parámetro (y param2, si usted tiene un salto de línea allí).

0

Si está utilizando Primefaces, debe insertar dentro del archivo .xhtml para que se convierta correctamente en entero java. Por ejemplo:

<p:selectCheckboxMenu 
    id="frameSelect" 
    widgetVar="frameSelectBox" 
    filter="true" 
    filterMatchMode="contains" 
    label="#{messages['frame']}" 
    value="#{platform.frameBean.selectedFramesTypesList}" 
    converter="javax.faces.Integer"> 
    <f:selectItems 
     value="#{platform.frameBean.framesTypesList}" 
     var="area" 
     itemLabel="#{area}" 
     itemValue="#{area}" /> 
</p:selectCheckboxMenu> 
1

no se ve como que tienes una respuesta, pero este problema también puede arrastrarse para arriba si estás pasando de identificación nulos en su APP predicado.

Por ejemplo.

Si hice una consulta sobre Gatos para volver una lista. Que devuelve 3 resultados.

Lista catList;

Luego, repito la lista de gatos y guardo una llave foriegn de gato, tal vez leashTypeId en otra lista.

List<Integer> leashTypeIds= new ArrayList<>(); 

for(Cats c : catList){ 
    leashTypeIds.add(c.getLeashTypeId); 
} 

jpaController().findLeashes(leashTypeIds); 

Si cualquiera de los gatos en catlist tienen un nulo leashTypeId se lanzará este error cuando intenta consultar su base de datos.

(Sólo di cuenta de que me anuncio en un hilo de 5 años, tal vez alguien se encuentra este útil)

Cuestiones relacionadas