【问题标题】:how to use postgresql array_agg function in JpaRepository spring boot?如何在 JpaRepository spring boot 中使用 postgresql array_agg 函数?
【发布时间】:2025-11-21 15:10:01
【问题描述】:

我已经使用 postgresql 创建了新的 Spring Boot 项目。我喜欢使用 JPA Repository 本机查询来使用 posgressql array_agg(ex:get all department),但它在发布时遇到了一些错误。我尝试了一些替代解决方案,但无法获得预期的数据。

错误

org.springframework.orm.jpa.JpaSystemException:没有 JDBC 类型的方言映射:2003; 嵌套异常是 org.hibernate.MappingException:没有 JDBC 类型的方言映射:2003

预期:应该得到数组或数据列表

@Repository
public interface PostGroupRepository extends JpaRepository<PostGroup, Integer> {

    @Query(value = "SELECT array_agg(department) FROM boxinfo;", nativeQuery = true)
    public Object[] getDept();
}

【问题讨论】:

  • 你尝试过什么?由于 postgres 返回数据类型 text[] - JPA /Hibernate 将没有数据类型。您需要进行自定义数据类型映射。
  • 我只是尝试了备用查询。如果可能的话,可以举一些自定义数据映射的例子@Lucia
  • @Lucia 可以直接进入本机查询本身??无需添加额外的工作?

标签: spring-boot spring-mvc java-8 spring-data-jpa


【解决方案1】:

第一个解决方案是使用以下依赖项:

<dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>2.11.1</version>
        </dependency>

他已经编写了自定义类型并将其注册到自定义方言中,如下所示

public class CustomPostgreDialect extends PostgreSQL10Dialect {
    public CustomPostgreDialect() {
        super();
        this.registerHibernateType(2003, StringArrayType.class.getName());
    }
} 

并将这个方言作为spring boot的application.yaml或application.properties中的hibernate方言。

spring.jpa.properties.hibernate.dialect: <packageName>.CustomPostgreDialect

第二种方案是自己写自定义类型,如上图在方言中注册,如果不想使用依赖的话。

【讨论】: