bitwise_and 在 Postgres 9.4 和 Hibernate 5 中如何工作

How does bitwise_and work in Postgres 9.4 and Hibernate 5

我们使用的是 PostgreSQl 9.4 和 Hibernate 5.1,这似乎是最新版本。我知道 Postgres 9.5 已经出来了,但 9.4 似乎并没有那么旧。 我们将 JPA 与 Hibernate 5.1 结合使用并创建 HQL 查询。

我们在数据库中有一个 bigint 字段。这是我们的位掩码,存储为整数。在 java 代码中,这很好用,但是当我们想要检查位掩码时,它就不起作用了。

ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 
ERROR: function bitwise_and(bigint, integer) does not exist
Hint: No function matches the given name and argument types. 
You might need to add explicit type casts.

我正在查看生成的休眠 sql,我可以看到我们有类似的东西:

bitwise_and(mytable_.actionbitmask, 2)>0 

所以,我想先让原始 SQL 工作,然后我可以调整我的 HQL 查询以使其也能工作。

现在,我搜索了 Google,所有结果都返回: - 无法在 HQL 中完成,必须使用常规 sql 但其中大部分都是非常古老的评论,而且由于 Postgres 是 9.4,Hibernate 是 5.1,我想现在我们肯定可以通过一些例子来解决这个问题。

不幸的是,即使是 Postgres 9.4 位操作也根本不显示 bitwise_and,文档在那里很烂。

在执行 HQL 之前,我是否应该将 decimals/longs 转换为 sql 字符串中相同长度的二进制文件?

如有任何帮助,我们将不胜感激。谢谢!

根据我在互联网上看到的和各种google搜索,有可能采用标准class 'PostgreSQLDialect',我们将其扩展到我们自己的class:

public class MyPostgreSQLDialect extends PostgreSQLDialect

然后我们在此处添加了创建特殊 'bitwise_and' 函数的代码。

我不得不更改 Spring 应用程序上下文文件中的数据库方言,并重新运行 我的 HQL 查询。

我只是不知道是这种情况,因为直到以前我们根本没有进行按位检查。直到最近我才知道我们有这个方言扩展。

但这解决了我们的问题。谢谢!