没有运算符匹配给定的名称和参数类型。 您可能需要添加显式类型转换。 – Netbeans,Postgresql 8.4和Glassfish

我正在尝试使用EclipseLink在Glassfish中使用JPA编辑Postgresql中的表。 当我插入一个实体时,它运行正常。 但是,当我尝试编辑或删除同一个实体时,它会因以下错误而失败。 任何想法?

引起:Exception [EclipseLink-4002](Eclipse Persistence Services  -  2.0.1.v20100213-r6600):org.eclipse.persistence.exceptions.DatabaseException
内部exception:org.postgresql.util.PSQLException:错误:运算符不存在:整数=字符变化
  提示:没有运算符匹配给定的名称和参数类型。 您可能需要添加显式类型转换。
  职位:38
错误代码: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)
        在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:867)
        在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:587)
        在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:530)
         at org.eclipse.persistence.internal.sessions.AbstractSession.executeCall(AbstractSession.java:914)
        在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205)
        在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191)
        在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteObject(DatasourceCallQueryMechanism.java:182)
        在org.eclipse.persistence.internal.queries.StatementQueryMechanism.deleteObject(StatementQueryMechanism.java:101)
         at org.eclipse.persistence.queries.DeleteObjectQuery.executeDatabaseQuery(DeleteObjectQuery.java:167)
        在org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:675)
        在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)
        在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)
        在org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1508)
        在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个
引起:org.postgresql.util.PSQLException:错误:运算符不存在:整数=字符变化
  提示:没有运算符匹配给定的名称和参数类型。 您可能需要添加显式类型转换。
  职位: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)
        在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:792)
         ......还有53个
 Java结果:1

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

这个主要错误:

错误:运算符不存在:整数=字符变化

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

解决方法(不是解决方案!)是做一些铸造。 看看这篇文章 。

看起来你没有得到答案但是如果你将null ID传递给你的JPA Predicate,这个问题也会出现问题。

例如。

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

列表catList;

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

List leashTypeIds= new ArrayList<>(); for(Cats c : catList){ leashTypeIds.add(c.getLeashTypeId); } jpaController().findLeashes(leashTypeIds); 

如果catList中的任何Cats具有null leashTypeId,则当您尝试查询数据库时,它将抛出此错误。

(刚刚意识到我在一个5岁的post上发帖,也许有人会觉得这很有用)

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

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

但是我看到我在构建器中做了一件不同的事情,而不是之前的程序代码。 这是他在WHERE子句中放置的谓词的顺序 ! 所以我开始移动这个谓词并很快发现谓词的顺序确实有很多话要说。 如果我单独使用这个谓词,我的查询工作(但当然返回错误的结果匹配),如果我只使用其中一个或另一个谓词它有时工作,其他时间不起作用。 此外,模仿程序代码的先前顺序也不起作用。 最后工作的是将这个恶魔谓词放在我的WHERE子句的开头,就像第一个谓词一样! 所以,如果我还没有弄清楚,那么我的谓词添加到WHERE方法/子句的顺序就是创建这个exception。

我想这可能是由于很多事情。 在我的情况下,我的查询中有“WHERE id IN”条件,我在PreparedStatement上使用setString方法将dash分隔为字符串作为字符串。

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

如果有人遇到此exception并使用Scala多行字符串构建查询:

在这种情况下,某些JPA驱动程序看起来有问题。 我不确定Scala用于LINE END的字符是什么,但是当你在行尾有一个参数时,LINE END字符似乎附加到参数上,所以当驱动程序解析查询时,错误出现了。 一个简单的解决方法是在最后的param之后留下一个空的空间:

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

所以,只需确保在param之后留下一个空格(如果你有换行符,则为param2)。

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