【问题标题】:How to use Postgres array "contains" condition with Hibernate?如何在 Hibernate 中使用 Postgres 数组“包含”条件?
【发布时间】:2018-12-06 10:16:34
【问题描述】:

我写了一个如下的 Postgres 查询,但它在构建时失败了。如何在 Spring-boot Hibernate 中实现?

 @Query(value="SELECT t from CatalogView t WHERE t.locations=:locations AND STRING_TO_ARRAY(t.myColumn, ',') @> STRING_TO_ARRAY(:myColumn, ',')")
 public Set<TrainerGuides> getData(@Param("locations") String locations,@Param("myColumn") String myColumn);

我为什么写这个? 将一堆用逗号分隔的字符串与 Postgres 中的无序字符串输入进行比较。

    catalog
    ----------------------------------
    id   title     keywords
    ----------------------------------
    1    Title-1   k2,k1,k3,k4,k5
    2    Title-2   k1,k3,k5,k6

通过将关键字与我的输入 k1,k2,k5 进行比较来选择行

在上面的例子中,id 为 1 的行必须出现。

SELECT *
FROM   catalog
WHERE  STRING_TO_ARRAY(keywords, ',') @> STRING_TO_ARRAY('k1,k2,k5', ',')

【问题讨论】:

  • 不能使用参数插入表、列、函数等标识符名称。这是一种安全预防措施。
  • @Query 是否表示原生查询?您将无法在 HQL 或 JPQL 中使用 DBMS 特定的函数和运算符
  • 你必须在 @Query() 中设置 nativeQuery=true
  • @DHARMENDRASINGH 我能够构建它。我希望现在就会出现预期的结果。谢谢

标签: arrays postgresql hibernate spring-boot


【解决方案1】:

您可以扩展 Hibernate Postgresql 方言并将本机数据库功能添加到您的 HQL 中,示例如下:

我从未使用过 STRING_TO_ARRAY,但其余的工作正常。

public class PostgreSQLDialect extends org.hibernate.dialect.PostgreSQLDialect
{

public PostgreSQLDialect()
{
    super();
    registerFunction("replace", new StandardSQLFunction("replace", Hibernate.STRING));
    registerHibernateType(Types.ARRAY, "array"); 
    registerFunction( "string_agg", new StandardSQLFunction("string_agg", Hibernate.STRING) );
    registerFunction( "generate_series", new StandardSQLFunction("generate_series") );
    registerFunction( "STRING_TO_ARRAY", new StandardSQLFunction("STRING_TO_ARRAY", Hibernate.STRING) );
}

@Override
public boolean supportsTupleDistinctCounts()
{
    return true;
}

}

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2014-05-06
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多