Ни один оператор не соответствует заданному имени и типу (аргументам) аргумента. Возможно, вам придется добавить явные приведения типов. - Netbeans, Postgresql 8.4 и Glassfish - PullRequest
11 голосов
/ 18 сентября 2010

Я пытаюсь редактировать таблицу в 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

Ответы [ 7 ]

17 голосов
/ 28 января 2013

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

9 голосов
/ 18 сентября 2010

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

ОШИБКА: оператор не существует: целое число = символ меняется

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

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

1 голос
/ 14 февраля 2015

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

Например.

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

List catList;

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

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

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

jpaController().findLeashes(leashTypeIds);

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

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

0 голосов
/ 18 июля 2014

Если вы используете 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>
0 голосов
/ 30 апреля 2014

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

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

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

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

0 голосов
/ 25 ноября 2013

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

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

0 голосов
/ 27 июня 2013

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

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

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

...