PGError: ERROR: оператор не существует: числовой = логический - PullRequest
0 голосов
/ 12 декабря 2018

Используя hibernate 5.2 и postgreSQL 42.2, мы получаем эту ошибку:

Вызывается: org.postgresql.util.PSQLException: FEHLER: Оператор existiert nicht: numeric = логический Hinweis: Kein Operator stimmt mitdem angegebenen Namen und den Argumenttypen überein.Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.Позиция: 559 в org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2440) ~ [postgresql-42.2.4.jar: 42.2.4] в org.postgresql.core.v3.QueryExeclmpl.java: 2183) ~ [postgresql-42.2.4.jar: 42.2.4] в org.postgresql.core.v3.QueryExecutorImpl.execute (QueryExecutorImpl.java:308) ~ [postgresql-42.2.4.jar: 42.2.4] в org.postgresql.jdbc.PgStatement.executeInternal (PgStatement.java:441) ~ [postgresql-42.2.4.jar: 42.2.4] в org.postgresql.jdbc.PgStatement.execute (PgStatement.java:365)~ [postgresql-42.2.4.jar: 42.2.4] в org.postgresql.jdbc.PgPreparedStatement.executeWithFlags (PgPreparedStatement.java:150) ~ [postgresql-42.2.4.jar: 42.2.4] в org.postgresql.jdbc.PgPreparedStatement.executeQuery (PgPreparedStatement.java:113) ~ [postgresql-42.2.4.jar: 42.2.4] по адресу com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery (NewProxy0jp3d_3_3_3_3)-0.9.5.2.jar: 0.9.5.2] at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract (ResultSetReturnImpl.java:60) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.loader.Loader.getResultSet (Loader.java:2167) ~[hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.loader.Loader.executeQueryStatement (Loader.java:1930) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] at org.hibernate.loader.Loader.executeQueryStatement (Loader.java:1892) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] вorg.hibernate.loader.Loader.doQuery (Loader.java:937) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (загрузчик)..java: 340) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.loader.Loader.doList (Loader.java:2689) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.loader.Loader.doList (Loader.java:2672) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] at org.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2506) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.loader.Loader.list (Loader.java:2501) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.loader.hql.QueryLoader.list (QueryLoader.java:504) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.hql.internal.ast.QueryTranslatorImpl.list (QueryTranslatorImpl.java:395) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final] в org.hibernate.engine.query.spi.HQLQueryPlan.performList (HQLQueryPlan.java:220) ~ [hibernate-core-5.3.4.Final-pit2.jar: 5.3.4.Final]

Отображение выглядит следующим образом:

<id name="id" column="id"  type="long">
    <generator class="assigned"/>
</id>
<property name="abool" type="java.lang.Boolean" column="abool" />

Запрос выглядит так:

session.createQuery("from " + TestUser.class.getName() + " where
abool=true").list();

1 Ответ

0 голосов
/ 12 декабря 2018

Лучшее решение:

использовать параметры запроса, такие как

 query = session.createQuery("from " + TestUser.class.getName() + " where
abool=:myboolean");
  query.setBoolean( "myboolean", boolValue);
  • лучшее преобразование типов для всех баз данных
  • sql-инъекцияневозможно
  • лучшая производительность из-за кэширования подготовленного состояния

Решение для огромной кодовой базы: Создайте свой собственный класс диалекта:

public class PostgreSQL9DialectParcIT
    extends PostgreSQL9Dialect {

    public String toBooleanValueString(boolean bool) {

        return bool ? "1" : "0"; //$NON-NLS-1$//$NON-NLS-2$
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...