【问题标题】:Hibernate, PostgreSQL: how to search in an array columnHibernate,PostgreSQL:如何在数组列中搜索
【发布时间】:2019-02-14 09:23:52
【问题描述】:

我使用 PostgreSQL 表 agents。它有一个zip_codes character(5)[] 列,用于存储代理负责区域的邮政编码。

它存储agent1 与邮政编码{11111,22222}agent2 与邮政编码{33333}

我想寻找所有负责某个特殊区域的代理商。

没有 Hibernate 很容易:SELECT * FROM agents WHERE '11111' = ANY (zip_codes) 返回 agent1

但是如何使用 HQL 来实现呢?它不知道any。但是如果我改用in,我会得到错误的结果:如果我写select agents from Agents as agents where '{11111}' in (agents.zip_codes),将找不到agent1。如果我改用'{33333}',就会找到agent2

当然,我可以使用类似(在 sql 中)WHERE zip_codes[1] = '11111' OR zip_codes[2] = '11111'(PostgreSQL 中的数组从索引 1 开始)进行搜索,但这对于 zip_codes 中的许多条目来说并不方便。

【问题讨论】:

  • 请分享您的表格结构,邮政编码是否保存在不同的表格中?
  • @VladHanzha 不,它们是内联存储的。
  • 这是他们的text 字段类型?在这种情况下,问题是您正在寻找带右括号的 {11111},但您的字段也包含 22222。在这种情况下,您应该寻找 11111,不带括号
  • 你的意思是select agents from Agents as agents where '11111' in (agents.zip_codes)?然后PostgreSQL抛出错误:malformed array literal: "11111" ... Array value must start with "{" or dimension information.

标签: postgresql hibernate hql


【解决方案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 中注册 dailect

<prop key="hibernate.dialect">com.test.MyPostgresSQLDialect</prop>

【讨论】:

  • 谢谢,这比我的解决方法要好得多,因为我可以将 IN 子句用于非数组列。
【解决方案2】:

使用 Hibernate 拦截器的解决方法

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

编写 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 (");
  }
}

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多