【问题标题】:Hibernate: unnest function not found休眠:未找到未嵌套函数
【发布时间】:2020-02-15 06:34:59
【问题描述】:

我正在尝试进行查询并使用 postgresql (pgadmin) 它可以正常工作,但自休眠 (Java Spring JPA) 以来就没有。跳过unnset不知道的错误

我的查询如下:

@Query("select w from Work w where array_length(w.groups, 1) is null or exists (select 1 from unnest(w.groups) n where n = :group)")

而且报错如下:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: unnest near line 1, column 123 [select w from org.vin.ns.core.domain.model.Work w where array_length(w.groups, 1) is null or exists (select 1 from unnest(w.groups) n where n = :group)]

有人知道我如何在休眠中使用 unnest 函数吗?

数据库中的groups字段的类型是text[]

谢谢。

【问题讨论】:

  • HQL(或 JPQL)对数据库特定功能一无所知。如果要使用unnest(),则需要创建原生查询
  • 但是除了unnest别无选择?
  • 我认为没有其他选择。您必须使用本机查询。

标签: java postgresql hibernate spring-data-jpa


【解决方案1】:

unnest 是一个 postgresql 函数,可以像任何其他函数一样被调用。例如:

@Query("select function('unnest', w.groups) from Work w")

尽管在 OP unnest 发布的查询中根本不需要。这样就可以将其转换为有效的 JPQL。

@Query("select w from Work w where w.groups is null or function('in_array', :group, w.groups) = true")

函数in_array可以定义为

public class MyPostgresqlDialect extends PostgisPG95Dialect {
    public MyPostgresqlDialect() {
        ...
        registerFunction("in_array", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, "(?1 = ANY(?2))"));
    }
}

【讨论】: