Postgresql PGError:错误:运算符不存在:数值=布尔值

Postgresql PGError:错误:运算符不存在:数值=布尔值,postgresql,hibernate,Postgresql,Hibernate,使用hibernate 5.2和postgreSQL 42.2,我们得到以下错误: 导致原因:org.postgresql.util.PSQLException:FEHLER:Operator existiert nicht:numeric=布尔Hinweis:Kein运算符stimmt mit 这是我的名字和论点。你是缪森吗 möglicherweise ausdrückliche Typumwandlungen hinzufügen.职位: 559 at org.postgresql.cor

使用hibernate 5.2和postgreSQL 42.2,我们得到以下错误:

导致原因:org.postgresql.util.PSQLException:FEHLER:Operator existiert nicht:numeric=布尔Hinweis:Kein运算符stimmt mit 这是我的名字和论点。你是缪森吗 möglicherweise ausdrückliche Typumwandlungen hinzufügen.职位: 559 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.4.jar:42.2.4]at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.4.jar:42.2.4]at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.4.jar:42.2.4]at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) ~[postgresql-42.2.4.jar:42.2.4]at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) ~[postgresql-42.2.4.jar:42.2.4]at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:150) ~[postgresql-42.2.4.jar:42.2.4]at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:113) ~[postgresql-42.2.4.jar:42.2.4]at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353) ~(c3p0-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]at org.hibernate.loader.loader.getResultSet(loader.java:2167) ~[hibernate-core-5.3.4.Final-pit2.jar:5.3.4.Final]at 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]at 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(loader.java:340) ~[hibernate-core-5.3.4.Final-pit2.jar:5.3.4.Final]at org.hibernate.loader.loader.doList(loader.java:2689) ~[hibernate-core-5.3.4.Final-pit2.jar:5.3.4.Final]at 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]at org.hibernate.loader.loader.list(loader.java:2501) ~[hibernate-core-5.3.4.Final-pit2.jar:5.3.4.Final]at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:504) ~[hibernate-core-5.3.4.Final-pit2.jar:5.3.4.Final]at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:395) ~[hibernate-core-5.3.4.Final-pit2.jar:5.3.4.Final]at 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();


最佳解决方案:

使用查询参数,如

 query = session.createQuery("from " + TestUser.class.getName() + " where
abool=:myboolean");
  query.setBoolean( "myboolean", boolValue);
  • 为所有数据库提供更好的类型转换
  • sql注入是不可能的
  • 由于preparedStatement缓存,性能更好
庞大代码库的解决方案: 创建自己的方言类:

public class PostgreSQL9DialectParcIT
    extends PostgreSQL9Dialect {

    public String toBooleanValueString(boolean bool) {

        return bool ? "1" : "0"; //$NON-NLS-1$//$NON-NLS-2$
    }

您是否尝试过abool所在的位置:mybool?Postgres对于使用
is
语法有点固执,因为MySQL很乐意接受
=
,所以人们不必根据数据重写查询。我们必须使用几个DBM,如DB2、Oracle、MS SQL Server。上述查询适用于所有这些查询。因此,在我们的例子中,不需要更改单个查询的解决方案更好。“abool是:myboolean”和query.setBoolean(“myboolean”,boolValue);也行!