我正在尝试使用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
答案 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);