Bitwise_and如何在Postgres 9.4和Hibernate 5

时间:2016-07-21 14:24:18

标签: java postgresql hibernate jpa bitwise-and

我们正在使用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.

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

bitwise_and(mytable_.actionbitmask, 2)>0 

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

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

不幸的是,即使Postgres 9.4位操作甚至根本没有显示bitwise_and,文档也很糟糕。

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

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

根据我在互联网上看到的内容以及各种谷歌搜索,有可能采用标准类'PostgreSQLDialect',我们将其扩展到我们自己的类:

public class MyPostgreSQLDialect extends PostgreSQLDialect

然后我们在这里添加了代码,它创建了一个特殊的'bitwise_and'函数。

我必须在Spring应用程序上下文文件中更改数据库方言,然后重新运行我的HQL查询。

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

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