我使用PostgreSQL表agents
。它具有一列zip_codes character(5)[]
,该列存储代理商负责的区域的邮政编码。
它存储邮政编码为agent1
的{{1}}和邮政编码为{11111,22222}
的{{1}}。
我想查找负责特殊区域的所有代理。
没有休眠很容易: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开头)进行搜索,但这对于zip_codes中的许多条目并不方便。
答案 0 :(得分:0)
休眠拦截器的解决方法
这不是一个很好的解决方案:
编写hql查询select agents from Agents as agents where '11111' in (agents.zip_codes)
并使用休眠拦截器
public class CustomInterceptor extends EmptyInterceptor {
@Override
public String onPrepareStatement(String sql) {
return sql.replaceAll("\\s+in\\s*\\(", " = any (");
}
}
答案 1 :(得分:0)
您可以这样注册dailect
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的高级注册人
<prop key="hibernate.dialect">com.test.MyPostgresSQLDialect</prop>