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

时间:2010-09-17 23:53:31

标签: java postgresql orm jpa eclipselink

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

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

12 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:9)

这是主要错误:

  

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

您的代码正在尝试匹配整数和字符串,但这不起作用。修复您的代码,获取所涉及的查询,看看您是否修复了它。另请参阅PostgreSQL日志文件。

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

答案 2 :(得分:1)

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

例如。

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

列出catList;

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

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

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

jpaController().findLeashes(leashTypeIds);

如果catList中的任何一个Cats都有一个null leashTypeId,当你尝试查询你的数据库时,它会抛出这个错误。

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

答案 3 :(得分:1)

这是由于Java实体的数据类型与数据库表列不匹配。 请检查所有列是否与您的实体完全相同的数据类型。 当我们更新模型属性的数据类型时,会发生这种不匹配。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

如果有人遇到此异常,并且正在使用Scala多行字符串构建查询:

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

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

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

答案 7 :(得分: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>

答案 8 :(得分:0)

在要传递查询参数的查询中,将typecast参数转换为整数

例如对于PostgreSQL,可能是

where table_name.column_name_with_integer_type = (:named_parameter_of_character_type)::integer

::integer会将参数值转换为整数。

答案 9 :(得分:0)

我在一个非常简单的DELETE语句中遇到了这个问题,现在已经解决了。

我的问题是由于在列周围使用了反引号(此列名为“ id”)。

此查询 DID NOT WORK 并导致“ No operator matches the given name and argument type(s)

DELETE FROM mytable WHERE `id` = 3      -- DO NOT USE BACKTICKS

来自mysql,在动态查询中,我总是“反引号”列。

以下查询 DID WORK (删除了反引号):

DELETE FROM mytable WHERE id = 3

答案 10 :(得分:0)

在我的情况下,我使用关键字作为列名,结果为ERROR: operator does not exist: name = bigint

解决方案是在列名周围使用双引号。

答案 11 :(得分:0)

当我尝试通过Set进行查询时遇到了这个问题,但我没有使用In

示例

问题:repository.findBySomeSetOfData(setOfData);

解决方案:repository.findBySomeSetOfDataIn(setOfData);