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

时间:2018-12-12 12:56:24

标签: postgresql hibernate

使用hibernate 5.2和postgreSQL 42.2,我们会收到此错误:

  

由以下原因引起:org.postgresql.util.PSQLException:FEHLER:运算符   存在nicht:数字=布尔值Hinweis:Kein运算符刺激   dem angegebenen Namen和den Argumenttypenüberein。西蒙森   奥地利Typhuwandlungenhinzufügen。位置:   559时   org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)   〜[postgresql-42.2.4.jar:42.2.4]在   org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.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(NewProxyPreparedStatement.java:353)   〜[c3p0-0.9.5.2.jar:0.9.5.2]在   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]在   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]在   org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.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]在   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 :(得分:-1)

最佳解决方案:

使用类似查询参数

 query = session.createQuery("from " + TestUser.class.getName() + " where
abool=:myboolean");
  query.setBoolean( "myboolean", boolValue);
  • 所有数据库的更好的类型转换
  • 无法进行sql注入
  • 由于prepareStatement缓存而使性能更好

巨大代码库的解决方案: 创建自己的方言类:

public class PostgreSQL9DialectParcIT
    extends PostgreSQL9Dialect {

    public String toBooleanValueString(boolean bool) {

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