如何在Hibernate中使用Postgres数组“包含”条件?

时间:2018-12-06 10:16:35

标签: arrays postgresql hibernate spring-boot

我写了一个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', ',')

1 个答案:

答案 0 :(得分: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;
}

}