我使用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>

10-08 00:26