我使用PostgreSQL表agents
。它有一个zip_codes character(5)[]
列,存储代理负责的区域的邮政编码。
它用邮政编码存储agent1
,用邮政编码存储{11111,22222}
。
我想找所有负责特殊区域的探员。
不使用Hibernate很容易:agent2
返回{33333}
。
但是我怎么才能用HQL呢?它不知道SELECT * FROM agents WHERE '11111' = ANY (zip_codes)
。但是如果我使用agent1
来代替,我将得到错误的结果:如果我写any
,将找不到in
。如果我改用select agents from Agents as agents where '{11111}' in (agents.zip_codes)
,就会找到agent1
。
当然,我可以用类似于(在sql中)'{33333}'
(PostgreSQL中的数组从索引1开始)的东西进行搜索,但这对于邮政编码中的许多条目来说并不方便。
最佳答案
你可以这样登记
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]") );
}
}
现在你可以在hql中使用
String hql = " from tablename" +
" where year = :year and month = :month and :version = array_any(versions)";
在sessionFactory中重新注册daillect
<prop key="hibernate.dialect">com.test.MyPostgresSQLDialect</prop>