2010-09-17 105 views
10

我想使用EclipseLink在Glassfish中使用JPA编辑Postgresql中的表。当我插入一个实体时,它运行良好。但是,当我尝试编辑或删除相同的实体时,它会因以下错误而失败。任何想法?没有操作符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 - Netbeans,Postgresql 8.4和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

如果相关请出示你的实体,相应的表,也许你的代码,生成的SQL。看到[这个以前的问题](http://stackoverflow.com/questions/2374395/is-it-possible-to-output-generated-sql-using-eclipselink-without-having-to-increa)输出生成的SQL 。 – 2010-09-18 14:50:58

+0

不要破解你的ORM和外部软件postgres允许你注册你自己的演员并比较操作。 [请看类似问题的例子](http://stackoverflow.com/questions/20773805/postgresql-enum-and-character-varying-updating/43748427#43748427)。 P.S.这是答案,但由于某种原因删除... – Hubbitus 2017-05-03 15:00:06

回答

8

这主要错误:

ERROR: operator does not exist: integer = character varying

你的代码试图匹配整数,字符串,这是行不通的。修复你的代码,得到所涉及的查询,看看你是否修复了它。另请参阅PostgreSQL日志文件。

解决方法(不是解决方案!)是做一些铸造。 Check this article

+0

你找到了什么是扔这个吗? – RMcNairn 2012-09-01 23:33:44

11

我有这个问题,并解决。这是由于WHERE子句包含字符串值而不是整数值。

0

兄弟,我有同样的问题。事情是我建立了一个查询生成器,这是一个非常复杂的动态构建他的谓词,等待已设置和缓存查询的参数。无论如何,在我构建查询构建器之前,我有一个非面向对象的过程代码构建了完美无瑕的相同事物(当然他没有缓存查询和使用参数)。现在,当我的构建者试图做同样的事情时,我的PostgreSQL抛出了你也收到的这个搞错的错误。我检查了我生成的SQL代码,发现没有错误。奇怪的确如此。

我的搜索很快证明它是WHERE子句中导致此错误的一个特定谓词。然而,这个谓词是由代码构建的,看起来像恰恰就像程序代码在这个异常开始出现之前的样子。

但是我看到了一件事情,在我的构建器中做了不同的事情,而不是之前的过程代码。这是他放在WHERE子句中的谓词的订单!所以我开始移动这个谓词并很快发现谓词的顺序有很多可以说。如果我单独拥有这个谓词,那么我的查询就有效(但当然会返回一个错误的结果匹配),如果我仅仅使用其中一个或另一个谓词,它有时会起作用,但在其他时间不起作用。而且,模仿程序代码的先前顺序也不起作用。最后的工作是将这个恶魔谓词放在我的WHERE子句的开头,作为第一个谓词的补充!所以再次如果我没有让自己清楚,那么添加到WHERE方法/子句中的谓词的顺序就是创建这个异常。

0

我想这可能是由于很多事情。 在我的情况下,它是在我的查询中有“WHERE ID IN”条件,并且我正在使用PreparedStatement上的setString方法将由短划线分隔的ID设置为字符串。

不知道是否有更好的方法来做到这一点,但我只是在我的声明中添加了占位符,并用我自己的值替换了它。

0

如果有人有此异常,并使用Scala的多行字符串是构建查询:

貌似有一个问题,在这种情况下,一些司机JPA。我不确定Scala用于LINE END的字符是什么,但是当行的末尾有一个参数时,LINE END字符似乎被附加到参数中,所以当驱动程序解析查询时,这错误出现。一个简单的解决办法是在最后帕拉姆之后留下的空白:

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

因此,只要确保PARAM后留下的空白空间(和参数2,如果你有一个换行符那里)。

0

如果您使用的是Primefaces,则应该在.xhtml文件中插入,以便正确转换为java整数。例如:

<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

看起来不像你得到一个答案,但这个问题也可以攀升,如果你传递无效的ID到您的JPA谓语。

例如,

如果我对猫进行查询以获取列表。其中返回3个结果。

List catList;

然后,我遍历猫的列表,并在另一个列表中存储cat的foriegn键或leashTypeId。

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

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

jpaController().findLeashes(leashTypeIds); 

如果任何猫在catList有一个空leashTypeId当您尝试查询您的数据库将抛出这个错误。

(刚刚意识到我张贴在一个5岁的线程,也许有人会觉得这很有用)

相关问题