Hibernate,PostgreSQL:如何在数组列中搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate,PostgreSQL:如何在数组列中搜索相关的知识,希望对你有一定的参考价值。

我使用PostgreSQL表agents。它有一个zip_codes character(5)[]列,用于存储代理负责区域的邮政编码。

它将qazxsw poi与邮政编码qazxsw poi和qazxsw poi以及邮政编码agent1存储在一起。

我想寻找负责特殊区域的所有代理商。

没有Hibernate就很容易:{11111,22222}返回agent2

但是我如何使用HQL呢?它不知道{33333}。但如果我改用SELECT * FROM agents WHERE '11111' = ANY (zip_codes),我会得到错误的结果:如果我写agent1,将找不到any。如果我改用in,就会找到select agents from Agents as agents where '{11111}' in (agents.zip_codes)

当然我可以搜索类似(在sql中)agent1(PostgreSQL中的数组以索引1开头),但这对于zip_codes中的许多条目来说并不方便。

答案

你可以像这样注册方言

'{33333}'

现在你可以在hql中使用了

agent2

记得在SessionFactory中注册方言

WHERE zip_codes[1] = '11111' OR zip_codes[2] = '11111'
另一答案

Hibernate拦截器的解决方法

这不是一个很好的解决方案:

编写hql查询public class MyPostgresSQLDialect extends PostgreSQLDialect { public MyPostgresSQLDialect() { super(); this.registerFunction( "array_any", new SQLFunctionTemplate(StandardBasicTypes.INTEGER,"ANY(?1)") ); this.registerFunction( "array_array", new SQLFunctionTemplate(StandardBasicTypes.INTEGER,"array[?1]") ); } } 并使用Hibernate Interceptor

String hql = " from tablename" +
            " where year = :year and month = :month and :version = array_any(versions)";

以上是关于Hibernate,PostgreSQL:如何在数组列中搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何在hibernate和postgresql中读出名称中带有冒号(:)的列

如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

将 PostgreSQL 9.2.1 与 Hibernate 连接起来

如何使用 JPQL、Spring Data Repositories 和 Hibernate 为 TimescaleDB `time_bucket` 函数参数化 Postgresql 间隔

Hibernate 不使用 Spring boot 在 PostgreSql 中创建数据库

PostgreSQL 组合无重复