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 间隔