代码之家  ›  专栏  ›  技术社区  ›  Johannes Flügel

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

  •  0
  • Johannes Flügel  · 技术社区  · 5 年前

    agents . 它有一列 zip_codes character(5)[] 它存储代理负责地区的邮政编码。

    agent1 {11111,22222} agent2 带着邮政编码 {33333} .

    我想找所有负责某个特殊区域的特工。

    没有休眠,很容易: SELECT * FROM agents WHERE '11111' = ANY (zip_codes) 代理1

    但是如何使用HQL呢?它不知道 any in 相反,我会得到错误的结果:如果我写 select agents from Agents as agents where '{11111}' in (agents.zip_codes) 代理1 找不到。如果我使用 '{33333}' 相反, 代理2 会被发现的。

    当然,我可以用(在sql中)这样的东西来搜索 WHERE zip_codes[1] = '11111' OR zip_codes[2] = '11111' (PostgreSQL中的数组以索引1开头),但这对于zip代码中的许多条目来说并不方便。

    0 回复  |  直到 5 年前
        1
  •  1
  •   vimuth    5 年前

    你可以这样注册daillect

    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]") );
    
      }
    }
    

    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>
    
        2
  •  0
  •   Johannes Flügel    5 年前

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

    编写hql查询 select agents from Agents as agents where '11111' in (agents.zip_codes) 使用Hibernate拦截器

    public class CustomInterceptor extends EmptyInterceptor {
    
      @Override
      public String onPrepareStatement(String sql) {
        return sql.replaceAll("\\s+in\\s*\\(", " = any (");
      }
    }