如何在 JpaRepository spring boot 中使用 postgresql array_agg 函数?

Posted

技术标签:

【中文标题】如何在 JpaRepository spring boot 中使用 postgresql array_agg 函数?【英文标题】:how to use postgresql array_agg function in JpaRepository spring boot? 【发布时间】:2021-08-18 10:17:25 【问题描述】:

我已经使用 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 vladmihalcea.com/postgresql-array-java-list这个可以查 ***.com/questions/21630370/… 也检查一下 @Lucia 可以直接进入本机查询本身??无需添加额外的工作? 【参考方案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

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

【讨论】:

以上是关于如何在 JpaRepository spring boot 中使用 postgresql array_agg 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JpaRepository spring boot 中使用 postgresql array_agg 函数?

如何使用 Spring Boot JpaRepository 保存多个表

在 spring jparepository 中加入多个表

如何在 Spring JpaRepository 中使用 JPQL 选择组中的最新记录?

如何将对象从一个 JpaRepository 转换为另一个 JpaRepository

在测试中使用 Spring JpaRepository