没有运算符匹配给定的名称和参数类型。 您可能需要添加显式类型转换。 – 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整数。 例如: