没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish
Posted
技术标签:
【中文标题】没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish【英文标题】:No operator matches the given name and argument type(s). You might need to add explicit type casts. -- Netbeans, Postgresql 8.4 and Glassfish 【发布时间】:2011-04-13 23:30:29 【问题描述】:我正在尝试使用 EclipseLink 在 Glassfish 中使用 JPA 在 Postgresql 中编辑表。当我插入一个实体时,它运行良好。但是,当我尝试编辑或删除同一个实体时,它会失败并出现以下错误。有什么想法吗?
原因:异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException 内部异常:org.postgresql.util.PSQLException:错误:运算符不存在:整数 = 字符变化 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 职位:38 错误代码:0 在 org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333) 在 org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1422) 在 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) 在 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) 在 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) 在 org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:109) 在 org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:112) 在 org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:86) 在 org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2857) 在 org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225) 在 org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207) 在 org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167) 在 org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:297) 在 org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:256) 在 org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1406) 在 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) 在 org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:268) 在 org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157) 在 org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68) 在 com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:412) ... 25 更多 引起:org.postgresql.util.PSQLException:错误:运算符不存在:整数=字符变化 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 职位:38 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:321) 在 com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:108) 在 org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:792) ... 53 更多 Java 结果:1【问题讨论】:
请显示您的实体、对应的表、如果相关,可能还有您的代码以及生成的 SQL。见this previous question输出生成的SQL。 不要破解您的 ORM 和外部软件 postgres 允许您注册自己的演员表和比较操作。 Please look example in similar question。附言这是答案,但由于某种原因被删除了…… 【参考方案1】:我遇到了这个问题,并解决了。这是由于 WHERE 子句包含字符串值而不是整数值。
【讨论】:
【参考方案2】:这是主要错误:
错误:运算符不存在: 整数 = 字符变化
你的代码试图匹配一个整数和一个字符串,这是行不通的。修复您的代码,获取所涉及的查询以查看您是否修复了它。另请参阅 PostgreSQL 日志文件。
一种解决方法(不是解决方案!)是进行一些转换。 Check this article.
【讨论】:
你找到是什么原因造成的吗?【参考方案3】:看起来您没有得到答案,但如果您将空 ID 传递到 JPA 谓词中,这个问题也可能会蔓延。
例如。
如果我对 Cats 进行查询以获取列表。返回 3 个结果。
列出猫列表;
然后,我遍历该猫列表并将 cat 的外键(可能是 leashTypeId)存储在另一个列表中。
List<Integer> leashTypeIds= new ArrayList<>();
for(Cats c : catList)
leashTypeIds.add(c.getLeashTypeId);
jpaController().findLeashes(leashTypeIds);
如果 catList 中的任何 Cats 的 leashTypeId 为空,则在您尝试查询数据库时会抛出此错误。
(刚刚意识到我在一个 5 年前的帖子上发帖,也许有人会觉得这很有用)
【讨论】:
6 年后仍然有用【参考方案4】:这是由于列类型与 Java 实体数据类型不匹配造成的。在传递查询参数的查询中,将参数类型转换为整数
例如在 PostgreSQL 的情况下,它可能是
where table_name.column_name_with_integer_type = (:named_parameter_of_character_type)::integer
::integer
会将参数值转换为整数。
【讨论】:
【参考方案5】:这是由于您的 java Entity 的数据类型与数据库表列不匹配造成的。 请检查所有列是否与您的实体的数据类型完全相同。 当我们更新模型属性的数据类型时,就会发生这种不匹配。
【讨论】:
【参考方案6】:兄弟,我也遇到了同样的问题。事情是我构建了一个查询构建器,这是一个相当复杂的构建器,它动态地构建他的谓词,等待已设置的参数并缓存查询。无论如何,在我构建我的查询构建器之前,我有一个非面向对象的过程代码构建了同样的东西(当然,除了他没有缓存查询和使用参数),它完美无缺。现在,当我的构建器尝试做同样的事情时,我的 PostgreSQL 抛出了你也收到的这个糟糕的错误。我检查了我生成的 SQL 代码,没有发现任何错误。确实很奇怪。
我的搜索很快证明是 WHERE 子句中的一个特定谓词导致了这个错误。然而,这个谓词是由看起来,几乎,一模一样的代码构建的,就像在这个异常开始突然出现之前程序代码的样子。
但是我发现我在构建器中所做的一件事与之前程序代码所做的不同。这是他放在 WHERE 子句中的谓词的顺序!所以我开始移动这个谓词,很快发现谓词的顺序确实有很多话要说。如果我一个人有这个谓词,我的查询有效(但当然返回了错误的结果匹配),如果我只给他一个或另一个谓词,它有时会起作用,其他时候不起作用。此外,模仿程序代码的先前顺序也不起作用。最终奏效的是把这个恶魔谓词放在我的 WHERE 子句的开头,正如第一个谓词添加的那样!因此,如果我没有说清楚,我的谓词添加到 WHERE 方法/子句的顺序是创建此异常。
【讨论】:
【参考方案7】:我想这可能是由于很多原因。 在我的情况下,我的查询中有“WHERE id IN”条件,我使用 PreparedStatement 上的 setString 方法将用破折号分隔的 ID 设置为字符串。
不确定是否有更好的方法来做到这一点,但我只是在我的声明中添加了占位符并用我自己的值替换它。
【讨论】:
【参考方案8】:如果您使用 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>
【讨论】:
【参考方案9】:在我的例子中,我使用关键字作为列名,结果是ERROR: operator does not exist: name = bigint
解决方案是在列名周围使用双引号。
【讨论】:
【参考方案10】:我在一个非常简单的 DELETE 语句中遇到了这个问题,现在已经解决了。
我的问题是由于在列周围使用了反引号(该列被命名为“id”)。
此查询没有工作并导致“No operator matches the given name and argument type(s)
”
DELETE FROM mytable WHERE `id` = 3 -- DO NOT USE BACKTICKS
来自 mysql,在动态查询中,我总是 `backtick` 列。
以下查询DID WORK(去掉了反引号):
DELETE FROM mytable WHERE id = 3
【讨论】:
【参考方案11】:当我尝试通过传递 Set 进行查询并且我没有使用 In 时遇到了这个问题
例子
问题:repository.findBySomeSetOfData(setOfData);
解决方案:repository.findBySomeSetOfDataIn(setOfData);
【讨论】:
【参考方案12】:如果有人遇到此异常并使用 Scala 多行字符串构建查询:
在这种情况下,某些 JPA 驱动程序似乎存在问题。我不确定 Scala 用于 LINE END 的字符是什么,但是当您在行尾有一个参数时,LINE END 字符似乎附加到参数上,因此当驱动程序解析查询时,这个错误出现。一个简单的解决方法是在最后的参数之后留下一个空白空间:
SELECT * FROM some_table a
WHERE a.col = ?param
AND a.col2 = ?param2
所以,请确保在 param(和 param2,如果那里有换行符)之后留一个空白空间。
【讨论】:
以上是关于没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish的主要内容,如果未能解决你的问题,请参考以下文章
在数据迁移时,出现错误:运算符不存在:布尔 = 整数提示:没有运算符与给定的名称和参数类型匹配