【问题标题】:PGError: ERROR: operator does not exist: numeric = booleanPGError:错误:运算符不存在:数字=布尔
【发布时间】:2018-12-12 12:56:24
【问题描述】:

使用 hibernate 5.2 和 postgreSQL 42.2 我们得到这个错误:

原因:org.postgresql.util.PSQLException: FEHLER: Operator exists nicht: numeric = boolean Hinweis: Kein Operator stimmt mit dem angegebenen Namen und den Argumenttypen überein。西米森 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.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();

【问题讨论】:

  • 你试过where abool is :mybool吗? Postgres 是一种使用 IS 语法的坚持者,因为 MySQL 很乐意接受 =,这样人们就不必根据数据重写他们的查询。
  • 我们必须使用几个 dbms,例如 DB2、Oracle、MS-SQL-Server。上面的查询适用于所有这些。因此,在我们的案例中,不需要更改单个查询的解决方案会更好。
  • "abool is :myboolean" and query.setBoolean("myboolean", boolValue);也可以!

标签: postgresql hibernate


【解决方案1】:

最佳解决方案:

使用查询参数,如

 query = session.createQuery("from " + TestUser.class.getName() + " where
abool=:myboolean");
  query.setBoolean( "myboolean", boolValue);
  • 为所有数据库提供更好的类型转换
  • sql-injection 是不可能的
  • preparedStatement 缓存带来更好的性能

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

public class PostgreSQL9DialectParcIT
    extends PostgreSQL9Dialect {

    public String toBooleanValueString(boolean bool) {

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

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2013-06-05
    • 1970-01-01
    • 2012-08-08
    • 2011-07-03
    相关资源
    最近更新 更多