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

java postgresql orm jpa eclipselink

90612 观看

8回复

136 作者的声誉

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

引起:Exception [EclipseLink-4002](Eclipse Persistence Services  -  2.0.1.v20100213-r6600):org.eclipse.persistence.exceptions.DatabaseException
内部异常: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)
        在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)
        at 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)
        在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)
        在org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:297)
        在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个
引起: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
作者: Sam 的来源 发布者: 2010 年 9 月 17 日

回应 (8)


9

78481 作者的声誉

这个主要错误:

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

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

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

作者: Frank Heikens 发布者: 18.09.2010 09:32

17

2808 作者的声誉

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

作者: Satheesh Cheveri 发布者: 28.01.2013 05:02

0

10029 作者的声誉

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

我的搜索很快证明,它是WHERE子句中的一个特定谓词导致了这个错误。然而,这种断言是由一个看起来像代码而建,几乎,正是因为程序代码是如何看起来像在此之前的异常开始出现无章可循。

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

作者: Martin Andersson 发布者: 27.06.2013 11:38

0

1627 作者的声誉

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

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

作者: TondaCZE 发布者: 25.11.2013 05:44

0

311 作者的声誉

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

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

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

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

作者: Jason Oviedo 发布者: 30.04.2014 07:21

0

1231 作者的声誉

如果您使用的是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>
作者: Ricardo Anjos 发布者: 18.07.2014 07:28

1

296 作者的声誉

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

例如。

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

列表catList;

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

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

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

jpaController().findLeashes(leashTypeIds);

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

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

作者: A. Smith 发布者: 14.02.2015 01:22

0

411 作者的声誉

在您将查询参数传递给查询的查询中,将typecast参数传递给整数

例如,在PostgreSQL的情况下,它可能是

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

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

作者: Asad Shakeel 发布者: 04.09.2019 02:05
32x32