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

时间:2019-02-14 09:23:52

标签: postgresql hibernate hql

我使用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中的许多条目并不方便。

2 个答案:

答案 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>