Оператор не соответствует указанному имени и типу аргументов. Возможно, вам придется добавлять явные типы. - Netbeans, Postgresql 8.4 и Glassfish

Я пытаюсь редактировать таблицу в Postgresql, используя JPA в Glassfish, используя EclipseLink. Когда я вставляю объект, он работает нормально. Но когда я пытаюсь отредактировать или удалить один и тот же объект, он не выполнит следующую ошибку. Любая идея?

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

Ответ 1

У меня была эта проблема и я решил. Это связано с тем, что предложение WHERE содержит значение String вместо целочисленного значения.

Ответ 2

Это основная ошибка:

ОШИБКА: оператора не существует: integer = изменяющийся символ

Вы пытаетесь сопоставить целое число и строку, которая не будет работать. Исправьте свой код, получите запрос, который будет задействован, чтобы убедиться, что вы его исправили. См. Также файлы журнала PostgreSQL.

Обходной путь (НЕ РЕШЕНИЕ!) - это сделать какое-то литье. Проверьте эту статью.

Ответ 3

Не похоже, что у вас есть ответ, но эта проблема также может появиться, если вы передаете нулевой идентификатор в ваш предикат JPA.

Например.

Если я сделал запрос на Cats, чтобы получить список. Что возвращает 3 результата.

Список catList;

Затем я перебираю этот список кошек и сохраняю ключ foriegn для cat, возможно, leashTypeId в другом списке.

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

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

jpaController().findLeashes(leashTypeIds);

Если какой-либо из кошек в catList имеет null leashTypeId, он будет выкидывать эту ошибку при попытке запросить вашу БД.

(Только что понял, что я публикую 5-летнюю нить, возможно, кто-то найдет это полезным)

Ответ 4

Бро, у меня была та же проблема. Дело в том, что я построил построитель запросов, довольно сложный, который динамически строит свои предикаты, ожидая, какие параметры были установлены и кэшированы запросы. В любом случае, до того, как я построил свой построитель запросов, у меня был неструктурированный объектно-ориентированный процедурный код, то же самое (за исключением, конечно, не кеширования запросов и использования параметров), которые работали безупречно. Теперь, когда мой строитель попытался сделать то же самое, мой PostgreSQL выбросил эту испорченную ошибку, которую вы тоже получили. Я изучил свой сгенерированный код SQL и не обнаружил ошибок. Странно.

Мой поиск вскоре доказал, что это был один конкретный предикат в предложении WHERE, вызвавший эту ошибку. Однако этот предикат был построен по коду, который выглядел почти так же точно, как выглядел процедурный код до того, как это исключение начало появляться из ниоткуда.

Но я видел одну вещь, которую я сделал по-другому в своем застройщике, в отличие от того, что ранее выполнял процедурный код. Это был порядок предикатов, которые он ввел в предложение WHERE! Поэтому я начал перемещать этот предикат, и вскоре обнаружил, что действительно предикаты могут многое сказать. Если бы у меня был этот предикат в одиночку, мой запрос работал (но, конечно, возвращал ошибочный результат-матч), если бы я поставил его с одним или другим предикатом, который он работал иногда, не работал еще раз. Более того, имитация предыдущего порядка процессуального кодекса тоже не работала. Что в конечном итоге работало, так это положить этот демонический предикат в начале моего предложения WHERE, когда добавился первый предикат! Поэтому, если я не дал себе ясности, порядок моих предикатов, добавленных в предложение WHERE method/, создавал это исключение.

Ответ 5

Я думаю, это может быть связано с многими вещами. В моем случае в моем запросе было условие "WHERE id IN", и я устанавливал идентификаторы, разделенные тире как строку, используя метод setString на PreparedStatement.

Не уверен, что есть лучший способ сделать это, но я просто добавил placeholder в свой оператор и сам заменил его значениями.

Ответ 6

Если кто-либо имеет это исключение и строит запрос, используя Scala многострочные строки:

Похоже, в этой ситуации есть проблема с некоторыми драйверами JPA. Я не уверен, что символ Scala использует для LINE END, но когда у вас есть параметр справа в конце строки, символ LINE END, похоже, привязан к параметру, и поэтому, когда драйвер анализирует запрос, эта ошибка возникает. Простая работа заключается в том, чтобы оставить пустое пространство сразу после парама в конце:

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

Итак, просто не забудьте оставить пустое место после param (и param2, если у вас там разрыв строки).

Ответ 7

Если вы используете Primfaces, вы должны вставить внутри файла .xhtml, чтобы он правильно преобразовывался в java integer. Например:

<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

В запросе, где вы передаете параметры запроса, введите параметр typecast в целое число

например в случае PostgreSQL это может быть

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

::integer преобразует значение параметра в целое число.